Pergunta

Pesquisei um pouco sobre isso, mas não obtive uma resposta particularmente direta.Em C (e eu acho que C++), como você determina o que vem depois de% ao usar printf?.Por exemplo:

double radius = 1.0;
double area = 0.0;
area = calculateArea( radius );
printf( "%10.1f     %10.2\n", radius, area );

Peguei esse exemplo direto de um livro que tenho sobre a linguagem C.Isso não faz sentido para mim.Onde você inventa 10.1f e 10.2f?Alguém poderia explicar isso?

Foi útil?

Solução

http://en.wikipedia.org/wiki/Printf#printf_format_placeholders é a referência da Wikipedia para espaços reservados de formato em printf. http://www.cplusplus.com/reference/clibrary/cstdio/printf.html também é útil

Basicamente, de forma simples, é%[largura].[precisão][tipo].A largura permite que você tenha certeza de que a variável que está sendo impressa tem pelo menos um determinado comprimento (útil para tabelas, etc.).Precisão permite especificar a precisão com que um número será impresso (por exemplo,casas decimais, etc.) e informa ao C/C++ qual é a variável que você forneceu (caractere, número inteiro, duplo etc.).

Espero que isto ajude

ATUALIZAR:

Para esclarecer usando seus exemplos:

printf( "%10.1f     %10.2\n", radius, area );

%10.1f (referindo-se ao primeiro argumento:raio) significa ter 10 caracteres (ou seja,pad com espaços) e imprima-o como um float com uma casa decimal.

%10,2 (referindo-se ao segundo argumento:área) significa ter 10 caracteres (como acima) e imprimir com duas casas decimais.

Outras dicas

man 3 printf

em um sistema Linux fornecerá todas as informações que você precisa.Você também pode encontrar essas páginas de manual on-line, por exemplo, em http://linux.die.net/man/3/printf

10.1f significa ponto flutuante com 1 casa após a vírgula e 10 casas antes da vírgula.Se o número tiver menos de 10 dígitos, ele será preenchido com espaços.10.2f é o mesmo, mas com 2 casas depois da vírgula.

Em todos os sistemas que vi, desde migrações Unix até Rails, esse não é o caso.@robintw expressa melhor:

Basicamente, de forma simples, é%[largura].[precisão][tipo].

Ou seja, não "10 lugares antes a vírgula decimal", mas "10 casas, antes e depois, e incluindo a vírgula."

10.1f significa ponto flutuante com 10 caracteres de largura e 1 casa após a vírgula decimal.Se o número tiver menos de 10 dígitos, ele será preenchido com espaços.10.2f é o mesmo, mas com 2 casas depois da vírgula.

Você tem estes tipos básicos:

%d   - integer
%x   - hex integer
%s   - string
%c   - char (only one)
%f   - floating point (float)
%d   - signed int (decimal)
%i   - signed int (integer) (same as decimal).
%u   - unsigned int
%ld  - long (signed) int
%lu  - long unsigned int
%lld - long long (signed) int
%llu - long long unsigned int

Editar:há vários outros listados na resposta de @Eli (man 3 printf).

Resumindo, esses valores após % indicam printf como interpretar (ou gerar) todas as variáveis ​​que virão posteriormente.No seu exemplo, radius é interpretado como um float (este é o 'f'), e o 10.1 fornece informações sobre quantas casas decimais usar ao imprimir.

Ver esse link para obter mais detalhes sobre todos os modificadores que você pode usar com printf.

10.1f significa que você deseja exibir um fmuito com 1 decimal e o número exibido deve ser 10 caracteres longos.

As páginas de manual contêm as informações que você deseja.Para ler o que você tem acima:

printf( "%10.2f", 1.5 )

Isso imprimirá:

         1.50

Enquanto:

printf("%.2f", 1.5 )

Impressões:

1.50

Observe a justificativa de ambos.De forma similar:

printf("%10.1f", 1.5 )

Iria imprimir:

        1.5

Qualquer número após o .é a precisão que você deseja imprimir.Qualquer número antes de .é a distância da margem esquerda.

Uma questão que não foi levantada por outros é se dobro é o mesmo que um flutuador.Em alguns sistemas, era necessário um especificador de formato diferente para um double comparado a um float.Até porque os parâmetros passados ​​poderiam ser de tamanhos diferentes.

 %f - float
 %lf - double
 %g - double

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top