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;

operador, como mostrado neste exemplo:

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 tipoTipoExemplo
d ou Eudecimal inteiro assinado-123
vocêdecimal inteiro unsigned456
ooctal não assinado05.670
Xhexadecimal sem sinal (letras minúsculas)89abc
Xhexadecimal sem sinal (em 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 (letras minúsculas)
UMAponto hexadecimal flutuante (em maiúsculas)
cPersonagemc
sCaracteres* (String ASCIIZ)exemplo
pendereço de ponteirobc080
%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.

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

LarguraSignificado
númeroO 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ãoOperando em 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 à esquerda
com 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 de
0.
*todosA 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.

comprimentod, iU, O, X, Xdecimalcs
Nenhumdentroint não assinadoDuplointCaracteres*
hhsigned charunsigned char
hassinado curtounsigned short
eulongounsigned longwchar_twchar_t *
lllongo longounsigned long long
eulong 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.


Publicações relacionadas