簡體   English   中英

scanf()和fgets()之間的區別

[英]Difference between scanf() and fgets()

我想知道fgets()scanf()之間的區別。 我使用C作為我的平台。

有許多不同之處。 兩個關鍵的是:

  • fgets()可以從任何打開的文件中讀取,但scanf()只讀取標准輸入。
  • fgets()從文件中讀取“一行文本”; scanf()可以用於此,但也處理從字符串到內置數字類型的轉換。

許多人將使用fgets()讀取一行數據,然后使用sscanf()來剖析它。

int scanf(const char * restrict format, ...);

scanf(3)搜索由給定輸入(稱為stdin)上的format參數定義的特定模式 ,其中模式由您定義。 scanf(3)的給定輸入取決於其變體(scanf,fscanf,sscanf,vscanf,vsscanf,vfscanf))可以是字符串或文件。

char *fgets(char * restrict str, int size, FILE * restrict stream);

fgets(3)只是從輸入文件流中讀取一行 ,並將字節作為空終止字符串復制到緩沖區str ,並將輸出限制為緩沖區大小給定的字節。

Scanf不執行邊界檢查。 fgets可能是更好的選擇。 然后,您可以使用sscanf()來評估它。

這里對這個主題的討論很好 - http://cboard.cprogramming.com/c-programming/109243-scanf-vs-fgets.html

如何使用scanf輸入空格? (那是我的邪惡雙胞胎因為忘記了這一點而演講 - 不是我)

scanf解析您讀入(或創建)的字符串,fgets從打開的FILE *中讀取一行。 或者你的意思是fscanf?

應該注意, scanf模式規范允許字段寬度限制:

scanf( " %80s", mybuffer );

但是, printf()允許將寬度作為變量傳遞(使用'*'):

printf( "My name is %*s.\n", 20, name );

scanf()沒有。 (它將'*'解釋為完全禁止/忽略該字段的標志。)這意味着你最終會做這樣的事情:

#define NAMEWIDTH 40
char buffer[ NAMEWIDTH + 4 ];
...
scanf( " %40x", buffer );

並且無法將scanf()的字段寬度40與緩沖區聲明中的緩沖區寬度40相連接。

主要區別在於scanf對可以讀取的字符數(默認使用)沒有限制,而fgets具有可以讀取的最大char數。

看兩個函數的原型:

char * fgets(char * dest,int size,FILE * stream);

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

你可以看到fgets的第二個參數強制讀取最多大小的char。

另一個明顯的區別是返回值: fgets在成功時返回指向dest的指針; scanf返回成功匹配和分配的輸入項的數量。 然后, scanf函數根據格式掃描輸入,並從標准輸入流stdin讀取輸入,而fgets默認從FILE *流讀取輸入。

總之,您可以使用scanf從FILE讀取數據並將它們插入到固定大小的數組中(例如)沒有多大意義。 scanf一個優點是輸出數據的格式化:如果函數讀取12345\\n ,則輸出為12345 ,而fgets讀取並返回直到\\n (包括),最后添加\\0作為字符串終止符。

暫無
暫無

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

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