Usando printf () para saída
A maioria dos exemplos que você vê de C ++ usam o chamado fluxo de saída para o código. a saída de fluxo utiliza lt; lt;
Menu
cout lt; lt; "O nome do usuário é" lt; lt; sUserName lt; lt; endl-
No entanto, C ++ herda uma outra forma de saída de seu antecessor, C. Esta forma é baseada em um conjunto de funções que são muito semelhantes, tanto na aparência e na forma como eles funcionam. 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 utilizar classes diferentes para o buffer de saída para reduzir o número de acessos de disco, aumentando assim o desempenho do programa. A mistura dos dois fará com que a saída para obter intercalada de forma imprevisível, resultando em saída confuso 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:
printf int (char const * formato, ...) -
as elipses (...) em uma declaração de protótipo significa qualquer número de qualquer tipo de variáveis.
O primeiro argumento para printf () é uma string para ser emitido. Se esta cadeia contém especificadores de formato, que são caracteres precedidos por um '%', então printf () emite o próximo argumento em linha usando que especificador de formato como orientação.
Isto é melhor demonstrado com um exemplo simples:
int i = 10-double d = 20.0-printf ( "i =% d, d =% f", i, d) -
Esta seria a saída da 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 () retorna o número de caracteres impressos. Se ocorrer um erro, este número será negativo.
especificadores de formato
especificadores de formato tem a forma
% [Flags] [largura] [. Precisão] [length] digite especificador
Cada um destes especificadores de formato é descrito nas secções seguintes.
especificadores de tipo
Os seguintes tipos específicos estão disponíveis para printf ()
especificador de tipo | Digitar | Exemplo |
---|---|---|
d ou Eu | decimal inteiro assinado | -123 |
você | inteiro decimal sem sinal | 456 |
o | octal não assinado | 05670 |
x | hexadecimal não assinado (em minúsculas) | 89abc |
x | hexadecimal não assinado (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 (em minúsculas) | |
UMA | ponto hexadecimal flutuante (maiúsculas) | |
c | Personagem | c |
s | char * (String ASCIIZ) | exemplo |
p | endereço de ponteiro | bc080 |
% | o % personagem | % |
Há pelo menos um especificador de 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 com um - se for negativo, mas não precedida por qualquer coisa se for positivo. Além disso, um tal valor leva apenas o número de espaços como os que são necessários para o número de saída.
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 mais), da mesma forma que 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 Seguindo |
---|---|---|
- | todos | Esquerda justificar a saída. |
+ | numérico | Precede números positivos, com uma +. Negativenumbers são sempre precedido por um -. |
espaço | numérico | Inserir um em branco se nenhum sinal vai ser escrito. |
# | O, X, ou X | Preceda número com 0, 0 x, ou0X. |
# | A, A, E, E, F, F, G, L | Incluir um ponto decimal, mesmo se a parte fracionária de thenumber é zero. |
0 | número | esquerda; pad o número com zeros (úteis dollaramounts ao imprimir). |
bandeira 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 de ocupar o mesmo número de espaços, mesmo se nem todos os espaços são necessários para exibir o valor. Por esta e milhares de outras aplicações, printf () permite que o usuário especifique a largura usando estas bandeiras de largura.
Largura | Significado |
---|---|
número | O número mínimo de caracteres para alocar para thisfield. |
* | A largura é especificada em um argumento inteiro paraprintf () precedendo o número a ser formatado. |
bandeira de precisão
A bandeira de precisão é mais frequentemente combinado com o sinalizador largura ao exibir números de ponto flutuante. 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 significa para fins diferentes tipos de ponto flutuante, como mostrado aqui, mas estes são menos utilizados.
Precisão | Operando no 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 no leftwith 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 of0. |
* | todos | A precisão é especificada em um argumento inteiro paraprintf () precedendo o número a ser formatado. |
bandeiras de comprimento
Ao contrário das bandeiras discutidos 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 que, na verdade, uma variável é 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 | char * |
hh | signed char | unsigned char | |||
h | assinado curta | 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 de 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 longo casal está esperando lá. Não tem nenhuma maneira de verificar novamente. Se um simples casal ou (Deus nos livre!) Um número inteiro é a próxima variável na pilha, em seguida, printf () irá lixo saída. Pior ainda, ele vai continuar a lixo saída a partir desse ponto em diante já que agora os especificadores e os argumentos estão fora de sincronia.
printf () não é extensível.
Os escritores printf () pensou em um monte de diferentes tipos de variáveis, mas se eles não pensar sobre isso, então você está fora de sorte.