2
  #include <stdio.h>
  void wrapperPrint(char* s)
  {
      printf(s);
      return;
  }

  int main()
  {

          wrapperPrint("Hello world\n");
          wrapperPrint("This is a string");

      return 0;
  }

プログラムが文字列を正しく出力する場合(gcc 4.6.3でテスト済み)、%d、%sなどの形式指定子が必要なのはなぜですか。つまり、このプログラムの潜在的な問題は何ですか。

4

4 に答える 4

6

そのままで全く問題ありません。ただし、パーセント記号を含む文字列を渡すと、問題が発生する可能性があります。これprintfは、変換指定子の先頭として処理しようとするためですが、1)変換指定子の残りの部分はおそらく存在しません。 、および2)どちらかを呼び出すときに一致する引数を渡さないprintfため、適切な変換指定子を渡すと、存在しない引数を使用しようとします(未定義の動作を与えます)。

于 2012-06-20T04:46:24.170 に答える
4

なぜ%d、%sなどのフォーマット指定子が必要なのですか?

printfフォーマットセーフではありません。tはそれ自体で型を理解しないので、データ引数printfのformat(type )を明示的に指示する必要があります。引数をprintどのように解釈するかを指示します。そうでない場合は、単に文字列として扱います。サンプルコードで)。

フォーマット指定子と実際のデータ型に不一致がある場合、取得されるのは未定義動作であることに注意してください。

于 2012-06-20T04:46:46.393 に答える
2

puts()を使用するか、printf( "%s"、s);を実行する必要があります。

フォーマット文字列に%sまたはその他のフォーマットが含まれている場合、printfは渡されなかった引数を読み取ろうとし、ランダムなメモリにアクセスしようとしますが、結果は定義されません。

%sを渡してプログラムを実行してみて、何が起こるかを確認してください。次に、valgrindの下でもう一度実行して、起こっている恐ろしいことを実際に確認してください。

于 2012-06-20T04:47:04.417 に答える
1

でフォーマット指定子の使用を義務付けるものは何もありませんprintf。むしろ、使用する形式に従って文字列を印刷したいからですprintf。他のメソッド(puts)を使用してプレーン文字列を出力できます。

上記のプログラムの場合、文字列にフォーマット指定子があると、printf下で呼び出しているため、プログラムはガベージを出力します。

于 2012-06-20T04:43:07.843 に答える