printf()
とputs()
で印刷できることを知っています。また、printf()
を使用すると、変数を補間して書式設定を行うことができます。
puts()
は、単にprintf()
のプリミティブバージョンです。文字列補間なしで、可能なすべてのprintf()
に使用する必要がありますか?
puts
はprintf
より簡単ですが、前者が自動的に改行を追加することに注意してください。それが望んでいない場合は、文字列をfputs
してstdoutにするか、printf
を使用できます。
(これはZan Lynxのコメントで指摘されていますが、受け入れられた答えがそれについて言及していないので、私はそれが正解に値すると思います)。
puts(mystr);
とprintf(mystr);
の本質的な違いは、後者では引数がフォーマット文字列として解釈されることです。文字列に制御文字(%
)が含まれていない場合、結果は多くの場合同じです(追加された改行を除く)が、それに頼ることができない場合(mystr
がリテラルではなく変数の場合)not使用します。
そのため、printf
の単一の引数として動的な文字列を渡すことは、一般的に危険です-概念的にはwrong-
char * myMessage;
// ... myMessage gets assigned at runtime, unpredictable content
printf(myMessage); // <--- WRONG! (what if myMessage contains a '%' char?)
puts(myMessage); // ok
printf("%s\n",myMessage); // ok, equivalent to the previous, perhaps less efficient
同じことがfputs
対fprintf
にも適用されます(ただし、fputs
は改行を追加しません)。
書式設定に加えて、puts
は、成功した場合は負でない整数を返し、失敗した場合はEOF
を返します。 printf
は、印刷された文字数を返します(末尾のnullは含みません)。
単純な場合、コンパイラーはprintf()
の呼び出しをputs()
の呼び出しに変換します。
たとえば、次のコードは、次に示すアセンブリコードにコンパイルされます。
#include <stdio.h>
main() {
printf("Hello world!");
return 0;
}
Push rbp
mov rbp,rsp
mov edi,str.Helloworld!
call dword imp.puts
mov eax,0x0
pop rbp
ret
この例では、GCCバージョン4.7.2を使用し、gcc -o hello hello.c
でソースをコンパイルしました。
私の経験では、printf()
は、形式文字列に関係なく、puts()
よりも多くのコードを処理します。
書式設定が必要ない場合は、printf
を使用しません。ただし、fwrite
からstdout
は、puts
よりもはるかに高速に動作します。
static const char my_text[] = "Using fwrite.\n";
fwrite(my_text, 1, sizeof(my_text) - sizeof('\0'), stdout);
注:コメントごとに、「\ 0」は整数定数です。コメントで示されるように、正しい式はsizeof(char)
である必要があります。
そう、printf
は、puts
のより強力なバージョンと考えることができます。 printf
は、%s
、%d
、%lf
などの形式指定子を使用して、出力用の変数formatを提供します。
int puts(const char *s);
puts()は、文字列sと末尾の改行をstdoutに書き込みます。
int printf(const char *format, ...);
関数printf()は、後続の引数を出力用に変換する方法を指定するフォーマット文字列の制御下で、出力をstdoutに書き込みます。
この機会を利用して、ドキュメントを読むようお願いします。
printf()関数は、文字列と変数の両方を画面に出力するために使用されますが、puts()関数は、画面にのみ文字列を出力することを許可します。
putsは簡単な選択で、最後に新しい行を追加し、printfはフォーマットされた文字列から出力を書き込みます。 putsのドキュメント: http://linux.die.net/man/3/puts およびprintfのドキュメント: http://linux.die.net/man/3/printf
これは切り替え方法よりも一貫性があるため、printfのみを使用することをお勧めします。つまり、デバッグする場合は、putsとprintfよりもすべてのprintfsを検索するのが簡単です。ほとんどの場合、印刷出力でも変数を出力する必要があるため、putは主にサンプルコードで使用されます。
puts()
とprintf()
を比較すると、メモリ消費量はほぼ同じですが、puts()
はprintf()
よりも時間がかかります。