14

printf成功すると負のエラーまたは文字数が返されることを知っています。この戻り値をチェックする唯一の理由は、プログラムの実行が何らかの形でprintfステータスに依存する場合です。しかし、この戻り値が役立つシナリオは思いつきませんでした。私は、printf関数の戻り値をチェックしたことがありません。

return status fromprintfが役立つシナリオは何ですか?

4

6 に答える 6

17

の戻り値には、少なくとも 2 つの用途がありますprintf

  1. エラーをチェックします。出力が対話型または純粋に有益な場合、これはほとんど重要ではありませんが、標準入出力またはファイルからのテキストを処理し、結果を標準出力に書き込むプログラムの場合、エラー (ディスクがいっぱい、パイプが閉じている、ドロップされているなど) が発生したかどうかを知ることが重要です。ネットワーク接続) が原因で、出力全体が書き込まれませんでした。これは、出力の完了後にソース ファイルが出力によって削除/置換される場合に特に重要です。ただし、バッファリングが原因で、printfそれ自体の結果を確認することは通常役に立ちません。ferror(stdout)書き込みエラーが発生したかどうかの信頼できる指標を得るために、最後の出力を書き込んでフラッシュした後に確認する必要があります。一方、 の戻り値を確認することで、障害の早期printf発見が可能になります。そのため、最初の行がすでに失敗しているときに何百万行も書き込もうとして時間を無駄にしないので、非常に便利なチェックになる可能性があります。それだけでは十分なチェックではありません。

  2. 出力された文字数が明らかでない場合は、何文字が書き込まれたかを知りたい場合があります。この数値の単純な使用法は、列を並べるためのものですが、視覚的なプレゼンテーションで文字の幅が固定されていると仮定するのはかなり時代遅れです。ただし、ソース コードをフォーマットしている場合は意味があるかもしれません。もう 1 つの同様の使用法 (これが古いものか古いものかはわかりません) は、固定幅フィールドをファイルに書き込むことです。たとえば、フィールドが 80 バイトでprintf52 を返した場合、フィールドを終了するためにさらに 28 バイトのパディングを書き込む必要があります。

于 2012-11-23T21:04:31.150 に答える
5

printf の戻り値を確認したい状況がいくつかあります。あなたが言及したように、1つはエラーをチェックすることです。通常、printf でエラーが発生した場合にできることは何もありませんが、非常に大きなものを印刷していてエラーが発生した場合は、小さなチャンクで印刷してみることにします。

出力の幅にも興味があるかもしれません。printf()成功時に書き込まれた文字数を返します。出力を並べようとしていてprintf()、可変幅のものを実行する場合は、戻り値をチェックして、印刷された文字数を確認できるため、現在の列がわかります。もちろん、これはすべての文字が 1 列幅の場合にのみ機能しますが (これはほとんどの ASCII 文字に当てはまります)、これが役立つ場合もあります。

snprintf()stdout やファイルではなく、固定サイズのバッファーに出力します。指定したバッファのサイズまでしか出力されません。ただし、文字列全体を出力するには、より多くのスペースが必要になる可能性があります。文字列全体を出力するのに必要なスペースの量を返します。このようにして、戻り値を使用して適切なサイズの新しいバッファーを割り当て、元のバッファーが小さすぎる場合は再試行できます。snprintf()このため、ほとんどの場合、 の戻り値を使用します。

于 2012-11-23T21:03:58.257 に答える
3

これが使用される主な理由の 1 つは、トラブルシューティングです。Printf は、(STDOUT だけでなく) ファイルへの書き込みにも使用できます。一部のアプリケーションでは、すべての文字がファイルに書き込まれていることを確認することが重要です。この例を以下に示します。

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
  FILE *fp;

  printf("This will display on the screen.\n");

  if((fp=freopen("OUT", "w" ,stdout))==NULL) {
    printf("Cannot open file.\n");
    exit(1);
  }

  if( printf("This will be written to the file OUT.") < 0){
      return -1;
  }

  fclose(fp);

  return 0;
}

なぜ printf を使用してファイルを印刷する必要があるのか​​ 疑問に思うかもしれません。このことを考慮。エラー ログを実装せず、代わりに printf を使用するソフトウェアが開発されました。知識のある C プログラマーは、printf の出力をコードの先頭にあるファイルにリダイレクトして、STDOUT ではなくファイルにエラー ログを実装できます。この時点で、printf の戻り値を使用して、これらのエラーが正しく出力されたことを確認できます。

于 2012-11-23T20:56:47.487 に答える
2

これは主にエラー チェックを目的としています。戻り値を使用して、操作が成功したかどうかを確認できます。

負でない値 (書き込まれた文字数を示す) が返された場合は、操作が成功したことを意味します。負の数が返された場合は、何らかのエラーが発生しています。

例えば、

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    int result = printf("This is a test!");
    if (result > 0)
    {
        printf("%d characters were written!", result);
        return EXIT_SUCCESS;
    }
    else return EXIT_FAILURE;
}
于 2012-11-23T20:54:20.680 に答える
0

私も戻り値を使ったことはありません。ただし、エラー チェックのほかに、出力された文字数をカウントして、何らかの統計や制限を作成する場合があります。

于 2012-11-23T20:53:46.380 に答える
0

場合によってprintfは、文字列の一部しか stdout に出力できないことがありますが、これはエラーではありません。

文字列が完全に送信されたことを確認する必要がある場合は、戻り値を使用してこれを確認できます。

やソケットなどを扱うときに最も便利ですfprintfが、それでも役立つ可能性があります。

于 2012-11-23T20:58:00.717 に答える