web-dev-qa-db-ja.com

Cのprintf()とputs()の違いは何ですか?

printf()puts()で印刷できることを知っています。また、printf()を使用すると、変数を補間して書式設定を行うことができます。

puts()は、単にprintf()のプリミティブバージョンです。文字列補間なしで、可能なすべてのprintf()に使用する必要がありますか?

159
alex

putsprintfより簡単ですが、前者が自動的に改行を追加することに注意してください。それが望んでいない場合は、文字列をfputsしてstdoutにするか、printfを使用できます。

127

(これは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

同じことがfputsfprintfにも適用されます(ただし、fputsは改行を追加しません)。

83
leonbloy

書式設定に加えて、putsは、成功した場合は負でない整数を返し、失敗した場合はEOFを返します。 printfは、印刷された文字数を返します(末尾のnullは含みません)。

28
echristopherson

単純な場合、コンパイラーは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でソースをコンパイルしました。

16
Hannu Balk

私の経験では、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)である必要があります。

11
Thomas Matthews

そう、printfは、putsのより強力なバージョンと考えることができます。 printfは、%s%d%lfなどの形式指定子を使用して、出力用の変数formatを提供します。

10
Justin Ethier
int puts(const char *s);

puts()は、文字列sと末尾の改行をstdoutに書き込みます。

int printf(const char *format, ...);

関数printf()は、後続の引数を出力用に変換する方法を指定するフォーマット文字列の制御下で、出力をstdoutに書き込みます。

この機会を利用して、ドキュメントを読むようお願いします。

8
user1831086

printf()関数は、文字列と変数の両方を画面に出力するために使用されますが、puts()関数は、画面にのみ文字列を出力することを許可します。

5
Wesley Nyandika

putsは簡単な選択で、最後に新しい行を追加し、printfはフォーマットされた文字列から出力を書き込みます。 putsのドキュメント: http://linux.die.net/man/3/puts およびprintfのドキュメント: http://linux.die.net/man/3/printf

これは切り替え方法よりも一貫性があるため、printfのみを使用することをお勧めします。つまり、デバッグする場合は、putsとprintfよりもすべてのprintfsを検索するのが簡単です。ほとんどの場合、印刷出力でも変数を出力する必要があるため、putは主にサンプルコードで使用されます。

2
Johan Engblom

puts()printf()を比較すると、メモリ消費量はほぼ同じですが、puts()printf()よりも時間がかかります。

1
thil