簡體   English   中英

為什么printf會返回一個值?

[英]Why does printf return a value?

我知道printf返回一個負面錯誤或成功打印的字符數。 只檢查此返回值的唯一原因是程序的執行以某種方式取決於printf狀態。 但我想不出這個返回值有用的場景。 我,從來沒有檢查過printf函數的返回值。

printf返回狀態有用的場景是什么?

printf的返回值至少有2次使用:

  1. 檢查錯誤。 當您的輸出是交互式或純信息時,這很少重要,但對於從stdio或文件處理文本並將結果寫入stdout的程序,重要的是要知道是否有錯誤(例如磁盤已滿,關閉管道或丟棄)網絡連接)阻止了整個輸出的寫入。 如果輸出完成后輸出將刪除/替換源文件,這一點尤其重要。 但是,由於緩沖,檢查printf本身的結果通常沒有幫助。 在寫完最后一個輸出並進行刷新后,您需要檢查ferror(stdout) ,以便可靠地指示是否發生了寫入錯誤。 在另一方面,檢查返回值printf允許您檢測故障 ,所以你不要浪費時間試圖在第一線已經沒有寫百萬行的,所以它可以是一個非常有用的檢查; 它本身並不是一個充分的檢查。

  2. 如果輸出的字符數不明顯,您可能想知道寫入了多少個字符。 這個數字的天真用法是用於排列列,但假設字符在其視覺呈現中具有固定寬度是相當陳舊的。 但是,如果您要格式化源代碼,則可能有意義。 另一個類似的用法(不確定這是否更少或更多過時)是在文件中寫入固定寬度字段。 例如,如果您的字段是80個字節而printf返回52,那么您需要再寫28個填充字節來完成該字段。

在某些情況下,您可能需要檢查printf的返回值。 一個是檢查錯誤,如你所說; 雖然如果printf上有錯誤,通常沒有什么可以做的,如果你打印的東西真的很大,並且得到錯誤,你可以決定嘗試用較小的塊打印它。

您可能還對輸出的寬度感興趣; printf()返回成功寫入的字符數。 如果你試圖排列輸出,並且你使用寬度可變的printf() ,你可以檢查返回值以找出打印的字符數,這樣你就可以知道你所在的列。 當然,這僅適用於所有字符都是1列寬(大多數ASCII字符都適用)的情況,但在某些情況下這可能會有用。

snprintf()打印到固定大小的緩沖區而不是stdout或文件。 它只會打印到你給它的緩沖區大小; 但它可能需要更多的空間來打印完整的字符串。 它返回打印完整字符串所需的空間量; 這樣,您可以使用返回值來分配適當大小的新緩沖區,如果原始緩沖區太小,請再試一次。 因此,您幾乎總是使用snprintf()的返回值。

使用它的主要原因之一是進行故障排除。 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的返回值來確保正確打印這些錯誤。

它主要用於錯誤檢查。 您可以使用返回值確保操作成功與否。

如果返回非負值(表示寫入的字符數),則表示操作成功。 如果返回負數,則會出現一些錯誤。

例如,

#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;
}

我也從未使用過返回值。 但是除了錯誤檢查之外,您可以計算已輸出的字符數,以進行某種統計或限制

在某些情況下, printf只能將一部分字符串放入stdout,這不是錯誤。

如果您必須確保您的字符串已完成,則可以使用返回值來查看此內容。

它在使用fprintf和插座等時很有用,但仍然有用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM