[英]Difference between fgets and fscanf?
我對C中的fgets和fscanf有疑問。這兩者之間到底有什么區別? 例如:
char str[10];
while(fgets(str,10,ptr))
{
counter++;
...
和第二個例子:
char str[10];
while(fscanf(ptr,"%s",str))
{
counter++;
...
當有一個包含由空格分隔的字符串的文本文件時,例如:AB1234 AC5423 AS1433。 在第一個示例中,while循環中的“counter”將不會提供與第二個示例中相同的輸出。 當更改fgets函數中的“10”時,計數器將始終給出不同的結果。 這是什么原因? 還有人可以解釋一下fscanf究竟做了什么,每個while循環中的字符串有多長?
函數fgets
讀取直到換行符(並且還存儲它)。 帶有%s
說明符的fscanf
讀取直到任何空格並且不存儲它...
作為旁注,您沒有在scanf中指定緩沖區的大小,並且它不安全。 嘗試:
fscanf(ptr, "%9s", str)
fgets
讀取到換行符。 fscanf
只能讀取空格。
在您的示例中, fgets
將從輸入流中讀取最多9個字符,並將它們與0終止符一起保存到str
。 它不會跳過前導空格。 如果在最大字符數之前看到換行符(將保存為str
)或EOF,它將停止。
帶有%s
轉換說明符的fscanf
將跳過任何前導空格,然后讀取所有非空白字符,將它們保存為str
后跟0終止符。 它會在下一個空格字符或EOF處停止讀取。 如果沒有明確的字段寬度,它將讀取與流中的非空白字符一樣多的非空白字符,可能會超出目標緩沖區。
因此,假設輸入流看起來像這樣: "\\t abcdef\\n<EOF>"
。 如果您使用fgets
讀取它, str
將包含"\\t abcdef\\n\\0"
。 如果使用fscanf
, str
可能包含"abcdef\\0"
(其中\\0
表示0終結符)。
fgets
讀了整行。 帶有%s
fscanf
讀取一個字符串,按空格分隔(或\\ n,\\ t等等)。 無論如何,你不應該使用它們,除非你確定你讀到的數組大到足以包含輸入。 您寫了When changing the "10" in the fgets function the counter will always give different results.
請注意,fgets和scanf不知道要讀取多少字節。 你應該告訴他們。 更改“10”只是放大這些函數寫入的緩沖區。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.