Usando printf () para a saída de
A maioria dos exemplos que você vê de C ++ usar o chamado fluxo de saída para o código. saída de fluxo usa o lt; lt;
Conteúdo
cout lt; lt; "O nome do usuário é " lt; lt; sUserName lt; lt; endl-
No entanto, C ++ herda outra forma de saída a partir do seu antecessor, C. Esta forma baseia-se num conjunto de funções que são muito semelhantes, tanto na aparência e no seu funcionamento. Coletivamente essas funções levar o nome de seu membro mais amplamente utilizado, printf ().
Você pode ignorar este artigo e continuar usando saída de fluxo, ou você pode mudar para printf () saída, se você preferir - mas você não deve misturar os dois no mesmo programa. Estes conjuntos de funções usam classes diferentes para o buffer de saída para reduzir o número de acessos a disco, aumentando assim o desempenho do programa. Misturando os dois vão causar saída para obter intercalado de formas imprevisíveis, resultando em saída confusa e talvez sem sentido.
A forma geral de printf (saída)
o printf () função tem o seguinte protótipo definido no cstdio incluir Arquivo:
Video: Aula - 9 Função Printf() Comando de Entrada e Saída
printf int (char const * formato, ...) -
as elipses (...) em uma declaração do protótipo significa qualquer número de qualquer tipo de variáveis.
O primeiro argumento para printf () é uma string para ser emitido. Se esta seqüência contém especificadores de formato, que são personagens precedido por um ‘%’, então printf () emite o próximo argumento na linha usando esse especificador de formato como orientação.
Isto é melhor demonstrado com um exemplo simples:
int i = 10-duplo d = 20,0-printf ("i =% d, d = f%", identidade)-
Esta saída seria a string
i = 10, d = 20,0000
Deve haver pelo menos tantos argumentos seguintes a cadeia de formato, pois há especificadores de formato na cadeia. Se houver mais, eles são ignorados. printf () devolve o número de caracteres impressos. Se ocorrer um erro, este número será negativo.
especificadores de formato
especificadores de formato têm a forma
% [Bandeiras] [largura] [. Precisão] [comprimento] type especificador
Cada um destes especificadores de formato é descrito nas secções seguintes.
especificadores de tipo
Video: Saída de Dados - Linguagm C - printf()
Os seguintes tipos específicos estão disponíveis para printf ()
especificador de tipo | Tipo | Exemplo |
---|---|---|
d ou Eu | decimal inteiro assinado | -123 |
você | decimal inteiro unsigned | 456 |
o | octal não assinado | 05.670 |
X | hexadecimal sem sinal (letras minúsculas) | 89abc |
X | hexadecimal sem sinal (em maiúsculas) | 89ABC |
f, F | ponto flutuante decimal | 123.456 |
e | notação científica (em minúsculas) | 1.23456e + 2 |
E | notação científica (maiúsculas) | 1.23456E + 2 |
g | O mais curto de f ou e | |
G | O mais curto de F ou E | |
uma | ponto hexadecimal flutuante (letras minúsculas) | |
UMA | ponto hexadecimal flutuante (em maiúsculas) | |
c | Personagem | c |
s | Caracteres* (String ASCIIZ) | exemplo |
p | endereço de ponteiro | bc080 |
% | o % personagem | % |
Há pelo menos um especificador tipo para cada um dos tipos de variáveis intrínsecas de C ++. Na ausência de qualquer informação adicional, C ++ usa valores padrão. Por exemplo, um número inteiro de saída com um d é precedido por um - se for negativo, mas não precedida com qualquer coisa se for positivo. Além disso, um tal valor leva apenas tantos espaços como são necessários para a saída do número.
bandeiras amplificador de saída
E se o formato de exibição padrão para um especificador inteiro tal como d não é o que você quer? Por exemplo, para algumas aplicações, pode ser importante que os números positivos são precedidos por um + (Sinal) da mesma forma que os negativos são precedidos por um - (Sinal de menos). Por isso, printf () fornece estas bandeiras amplificador de saída.
Bandeira | Operando em Tipo | Tem o efeito seguir |
---|---|---|
- | todos | Esquerda justificar saída. |
+ | numérico | Precede números positivos, com um +. Negativo os números são sempre precedidas por um -. |
espaço | numérico | Inserir um em branco se nenhum sinal vai ser escrito. |
# | o, x, ou X | Preceder o número com 0, 0 x, ou 0X. |
# | A, A, E, E, F, F, G, L | Incluir um ponto decimal, mesmo que a parte fracionária do número é zero. |
0 | número | esquerda; pad o número com zeros (útil dólar ao imprimir ascende). |
flag largura de saída
Suponha que você quer todos os números em uma coluna para alinhar. Nesse caso, seria importante que cada número ocupam o mesmo número de espaços, mesmo que nem todos esses espaços são necessários para exibir o valor. Por esta e milhares de outras aplicações, printf () permite ao usuário especificar a largura usando estas bandeiras de largura.
Largura | Significado |
---|---|
número | O número mínimo de caracteres para alocar para este campo. |
* | A largura é especificado em um argumento inteiro de printf () precedendo o número a ser formatado. |
bandeira Precision
A bandeira de precisão muitas vezes é combinado com a bandeira largura ao exibir números de ponto flutuantes. Neste caso, a bandeira de precisão diz printf () quantos dígitos para exibir depois do ponto decimal.
A bandeira de precisão foi dada significado para diferentes tipos de ponto flutuante, como mostrado aqui, mas estes são menos utilizados.
Precisão | Operando em tipo | Tem o seguinte efeito |
---|---|---|
número | d, I, O, U, X, X (tipos inteiros) | O número mínimo de caracteres para a saída. Pad à esquerda com 0 de se necessário. |
número | A, A, E, E, F, F (Tipos de ponto flutuante) | O número de dígitos para imprimir depois do ponto decimal. |
número | g; G (Tipos de ponto flutuante) | O número máximo de dígitos significativos para ser impresso. |
número | s (cadeia de caracteres) | O número máximo de caracteres para a saída. |
em branco | todos | Um período não seguida de um número é o mesmo que uma precisão de 0. |
* | todos | A precisão é especificado em um argumento inteiro para printf () precedendo o número a ser formatado. |
bandeiras de comprimento
Ao contrário das bandeiras discutidas acima, a bandeira comprimento não é tanto sobre dizendo printf () como exibir o número, mas mais sobre a dizer printf () sobre o próprio número. Por exemplo, suponha que você queira saída de uma variável usando um d formato, mas essa variável é realmente um long int? Não tem problema, basta usar ld, como descrito aqui.
comprimento | d, i | U, O, X, X | decimal | c | s |
---|---|---|---|---|---|
Nenhum | dentro | int não assinado | Duplo | int | Caracteres* |
hh | signed char | unsigned char | |||
h | assinado curto | unsigned short | |||
eu | longo | unsigned long | wchar_t | wchar_t * | |
ll | longo longo | unsigned long long | |||
eu | long double |
Revendo as vantagens e desvantagens de printf ()
o printf () estilo de saída tem uma vantagem significativa em comparação com a saída de fluxo: a gramática é extremamente concisa. Uma vez que você dominar todos os tipos especiais e comprimentos, larguras e precisões, você pode produzir uma variável em praticamente qualquer maneira que você quer com um número mínimo de digitação.
A concisão vem com um preço, no entanto:
A concisão faz printf () saída difícil para os não iniciados para entender.
printf () não é tipo seguro.
Se você diz para a saída do próximo campo usando um % Lf, então printf () irá assumir que um long double está esperando lá. Não tem nenhuma maneira de verificar novamente. Se um simples casal ou (Deus nos livre!) Um inteiro é a próxima variável na pilha, em seguida, printf () irá lixo saída. Pior ainda, ele vai continuar a lixo saída daquele ponto em diante já que agora os especificadores e os argumentos estão fora de sincronia.
printf () não é extensível.
Os escritores printf () pensei em um monte de diferentes tipos de variáveis, mas se eles não pensar sobre isso, então você está fora de sorte.