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;

operador, como mostrado neste exemplo:

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 tipoDigitarExemplo
d ou Eudecimal inteiro assinado-123
vocêinteiro decimal sem sinal456
ooctal não assinado05670
xhexadecimal não assinado (em minúsculas)89abc
xhexadecimal não assinado (maiúsculas)89ABC
F, Fponto flutuante decimal123.456
enotação científica (em minúsculas)1.23456e + 2
Enotação científica (maiúsculas)1.23456E + 2
gO mais curto de f ou e
GO mais curto de F ou E
umaponto hexadecimal flutuante (em minúsculas)
UMAponto hexadecimal flutuante (maiúsculas)
cPersonagemc
schar * (String ASCIIZ)exemplo
pendereço de ponteirobc080
%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.

BandeiraOperando em TipoTem o efeito Seguindo
-todosEsquerda justificar a saída.
+numéricoPrecede números positivos, com uma +. Negativenumbers são sempre precedido por um -.
espaçonuméricoInserir um em branco se nenhum sinal vai ser escrito.
#O, X, ou XPreceda número com 0, 0 x, ou0X.
#A, A, E, E, F, F, G, LIncluir um ponto decimal, mesmo se a parte fracionária de thenumber é zero.
0númeroesquerda; 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.

LarguraSignificado
númeroO 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ãoOperando no tipoTem o seguinte efeito
númerod, 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úmeroA, A, E, E, F, F
(Tipos de ponto flutuante)
O número de dígitos para imprimir depois do ponto decimal.
númerog, G
(Tipos de ponto flutuante)
O número máximo de dígitos significativos para ser impresso.
números
(Cadeia de caracteres)
O número máximo de caracteres para a saída.
em brancotodosUm período não seguida de um número é o mesmo que uma precisão of0.
*todosA 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.

Comprimentod, iu, o, x, Xdecimalcs
Nenhumdentroint não assinadoduplointchar *
hhsigned charunsigned char
hassinado curtaunsigned short
eulongounsigned long wchar_twchar_t *
lllongo longounsigned 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.

menu