Eu sei que você pode imprimir com printf()
e puts()
. Também posso ver que printf()
permite interpolar variáveis e formatar.
É puts()
apenas uma versão primitiva de printf()
. Deve ser usado para todos os possíveis printf()
sem interpolação de string?
printf(variable)
para imprimir uma string. Useputs(variable)
ouprintf("%s', variable)
. Há um risco de segurança ao usar uma sequência de formato variável: se a variável puder ser gravada por um invasor, eles poderão atacar o programa usando sequências de formato.Respostas:
puts
é mais simples que,printf
mas lembre-se de que o primeiro anexa automaticamente uma nova linha. Se não é isso que você deseja, você podefputs
usar sua string para usar o stdoutprintf
.fonte
(Isso é apontado em um comentário de Zan Lynx, mas acho que merece uma resposta - já que a resposta aceita não o menciona).
A diferença essencial entre
puts(mystr);
eprintf(mystr);
é que, no último, o argumento é interpretado como uma sequência de formatação . O resultado geralmente será o mesmo (exceto a nova linha adicionada) se a string não contiver caracteres de controle (%
), mas se você não puder confiar nisso (semystr
for uma variável em vez de literal), não deverá usá-la.Portanto, geralmente é perigoso - e conceitualmente errado - passar uma sequência dinâmica como argumento único de
printf
:O mesmo se aplica ao
fputs
vsfprintf
(masfputs
não adiciona a nova linha).fonte
printf()
seria menos eficiente? Em tempo de execução? Em tempo de compilação?printf
precisa analisar a string de formato. No entanto, isso normalmente deve ser irrelevante. Além disso, um compilador inteligente pode otimizar isso e substituir oprintf
puts
Além da formatação,
puts
retorna um número inteiro não negativo se for bem-sucedido ouEOF
se não for bem- sucedido; whileprintf
retorna o número de caracteres impressos (não incluindo o nulo à direita).fonte
Em casos simples, o compilador converte chamadas
printf()
em chamadas paraputs()
.Por exemplo, o código a seguir será compilado no código de montagem que mostro a seguir.
Neste exemplo, usei a versão 4.7.2 do GCC e compilei a fonte
gcc -o hello hello.c
.fonte
printf("Hello world!\n");
gcc de fato traduz isso para put. Como é uma mensagem antiga, eu mesma a editarei.-save-temps
opção para gcc faz issoCerto,
printf
poderia ser pensado como uma versão mais poderosa doputs
.printf
fornece a capacidade de formato variáveis para especificadores de formato de saída usando tais como%s
,%d
,%lf
, etc ...fonte
Na minha experiência,
printf()
carrega mais código do queputs()
independentemente da string de formato.Se não precisar de formatação, não o uso
printf
. No entanto,fwrite
parastdout
trabalhar muito mais rápido queputs
.Nota: por comentários, '\ 0' é uma constante inteira. A expressão correta deve ser a
sizeof(char)
indicada pelos comentários.fonte
'\0'
tem tipoint
, portanto, na maioria dos sistemas, isso será impressoUsing fwrit
. Se você deseja imprimir uma menor byte, basta usar 1.sizeof (char)
, que é provável que você pretende aqui, é garantido para ser 1.puts () grava a string se uma nova linha no stdout.
A função printf () grava a saída em stdout, sob o controle de uma sequência de formato que especifica como os argumentos subsequentes são convertidos para a saída.
Usarei esta oportunidade para solicitar que você leia a documentação.
fonte
a função printf () é usada para imprimir seqüências de caracteres e variáveis na tela, enquanto a função puts () permite imprimir apenas uma sequência na tela.
fonte
puts
é a escolha simples e adiciona uma nova linha no final eprintf
grava a saída de uma sequência formatada.Consulte a documentação para
puts
e paraprintf
.Eu recomendaria usar apenas,
printf
pois isso é mais consistente do que o método de alternância, ou seja, se você estiver depurando, é menos trabalhoso pesquisar todos os printfs queputs
eprintf
. Na maioria das vezes você também deseja gerar uma variável em suas impressões, portantoputs
é usado principalmente no exemplo de código.fonte
Ao comparar
puts()
eprintf()
, embora o consumo de memória seja quase o mesmo,puts()
leva mais tempo em comparação comprintf()
.fonte