[英]Why does printf return a value?
我知道printf
返回一個負面錯誤或成功打印的字符數。 只檢查此返回值的唯一原因是程序的執行以某種方式取決於printf
狀態。 但我想不出這個返回值有用的場景。 我,從來沒有檢查過printf
函數的返回值。
printf
返回狀態有用的場景是什么?
printf
的返回值至少有2次使用:
檢查錯誤。 當您的輸出是交互式或純信息時,這很少重要,但對於從stdio或文件處理文本並將結果寫入stdout的程序,重要的是要知道是否有錯誤(例如磁盤已滿,關閉管道或丟棄)網絡連接)阻止了整個輸出的寫入。 如果輸出完成后輸出將刪除/替換源文件,這一點尤其重要。 但是,由於緩沖,檢查printf
本身的結果通常沒有幫助。 在寫完最后一個輸出並進行刷新后,您需要檢查ferror(stdout)
,以便可靠地指示是否發生了寫入錯誤。 在另一方面,檢查返回值printf
允許您檢測故障早 ,所以你不要浪費時間試圖在第一線已經沒有寫百萬行的,所以它可以是一個非常有用的檢查; 它本身並不是一個充分的檢查。
如果輸出的字符數不明顯,您可能想知道寫入了多少個字符。 這個數字的天真用法是用於排列列,但假設字符在其視覺呈現中具有固定寬度是相當陳舊的。 但是,如果您要格式化源代碼,則可能有意義。 另一個類似的用法(不確定這是否更少或更多過時)是在文件中寫入固定寬度字段。 例如,如果您的字段是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.