Eu tenho um trecho de código no qual há um
printf("%.*s\n")
o que isso %.*s
significa?
Eu tenho um trecho de código no qual há um
printf("%.*s\n")
o que isso %.*s
significa?
Respostas:
Você pode usar um asterisco ( *
) para passar o especificador de largura / precisão para printf()
, em vez de codificá-lo na string de formato, ou seja,
void f(const char *str, int str_len)
{
printf("%.*s\n", str_len, str);
}
str_len
argumento deve ter tipo int
(ou tipo integral mais estreito, que seria promovido a int
). Seria um erro para passar long
, size_t
etc.
%s
, é imprimir uma sub-string da string original. Nesse caso de uso, str
apontaria para algum lugar dentro da string original (possivelmente no início) e str_len
especificaria o comprimento da substring que deve ser impressa.
Mais detalhado aqui .
valor inteiro ou
*
que especifica a largura mínima do campo. O resultado é preenchido com caracteres de espaço (por padrão), se necessário, à esquerda quando justificado à direita ou à direita se justificado à esquerda. No caso em que * é usado, a largura é especificada por um argumento adicional do tipo int. Se o valor do argumento for negativo, ele resultará com o sinalizador - especificado e largura de campo positiva. (Observação: esta é a largura mínima: o valor nunca é truncado.)
.
seguido por um número inteiro ou *, ou nenhum que especifique a precisão da conversão. No caso em que * é usado, a precisão é especificada por um argumento adicional do tipo int. Se o valor desse argumento for negativo, ele será ignorado. Se nem um número nem * forem usados, a precisão será considerada zero. Veja a tabela abaixo para efeitos exatos de precisão.
Então, se tentarmos as especificações de conversão
#include <stdio.h>
int main() {
int precision = 8;
int biggerPrecision = 16;
const char *greetings = "Hello world";
printf("|%.8s|\n", greetings);
printf("|%.*s|\n", precision , greetings);
printf("|%16s|\n", greetings);
printf("|%*s|\n", biggerPrecision , greetings);
return 0;
}
obtemos a saída:
|Hello wo|
|Hello wo|
| Hello world|
| Hello world|
Não acho que o código acima esteja correto, mas (de acordo com esta descrição printf()
) os .*
meios
A largura não é especificada na string de formato, mas como um argumento de valor inteiro adicional precedendo o argumento que deve ser formatado. '
Portanto, é uma string com uma largura aceitável como argumento.
int
(ou um subconjunto dele) - não apenas qualquer valor integral como mais intuitivo size_t
ou seus possíveis aliases, como std::string::size_type
. Isso é ainda mais confuso, levando em consideração que a página referenciada é mencionada size_t
como um dos especificadores de tipo suportados.
Veja: http://www.cplusplus.com/reference/clibrary/cstdio/printf/
.*
A precisão não é especificada na string de formato, mas como um argumento de valor inteiro adicional precedendo o argumento que deve ser formatado.
s
Seqüência de caracteres
printf
chamada válida .