[英]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.