簡體   English   中英

fgets和fscanf之間的區別?

[英]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" 如果使用fscanfstr可能包含"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.

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