201

printf()とで印刷できることはわかっていますputs()printf()また、変数を補間してフォーマットを行うことができることもわかります。

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

4

10 に答える 10

164

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

于 2010-03-16T13:06:06.430 に答える
115

(これはZan Lynxのコメントで指摘されていますが、受け入れられた回答に言及されていないことを考えると、回答に値すると思います)。

puts(mystr);との本質的な違いは、後者では引数がフォーマット文字列printf(mystr);として解釈されることです。文字列に制御文字 ( ) が含まれていない場合、結果はしばしば同じになります (追加された改行を除いて) 。%mystr

したがって、動的文字列を の単一の引数として渡すことは、一般的に危険であり、概念的に間違っていprintfます。

  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同じことがvsにも当てはまりますfprintf(ただしfputs、改行は追加されません)。

于 2013-05-29T12:07:40.193 に答える
38

フォーマットに加えて、成功または失敗したputs場合は負でない整数を返します。EOFwhileprintfは、出力された文字数を返します (末尾の null は含みません)。

于 2012-06-17T08:04:55.610 に答える
18

単純なケースでは、コンパイラは への呼び出しを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

于 2013-09-12T19:21:32.913 に答える
11
int puts(const char *s);

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

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

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

この機会にドキュメントを読んでいただきたいと思います。

于 2010-03-16T13:21:47.100 に答える
11

私の経験では、フォーマット文字列に関係なく、 printf()より多くのコードを取り込みます。puts()

フォーマットが必要ない場合は、使用しませんprintf。ただし、fwritetostdoutは よりもはるかに高速に動作しputsます。

static const char my_text[] = "Using fwrite.\n";
fwrite(my_text, 1, sizeof(my_text) - sizeof('\0'), stdout);

注: コメントごとに、'\0' は整数定数です。正しい表現はsizeof(char)、コメントで示されているとおりです。

于 2010-03-16T20:07:36.800 に答える
10

そうprintfです、のより強力なバージョンと考えることができますputs。、、、などのフォーマット指定子を使用して、出力用に変数をフォーマットprintfする機能を提供します。%s%d%lf

于 2010-03-16T13:05:58.177 に答える
7

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

于 2010-06-11T05:24:53.027 に答える
2

putsは単純な選択であり、最後に新しい行を追加しprintf、フォーマットされた文字列から出力を書き込みます。

puts およびのドキュメントを参照してくださいprintf

printfこれは方法を切り替えるよりも一貫性があるため、使用することをお勧めしputsますprintf。ほとんどの場合、印刷物にも変数を出力したいので、putsほとんどの場合、コード例で使用されます。

于 2015-06-16T12:16:42.697 に答える
0

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

于 2015-05-11T11:20:12.750 に答える