2013-06-26 57 views
2

我已經的大小的輸入通過許多職位上SO關於在scanf()優選使用的fgets()gets()。有的稱爲關於與fgets()man page與fgets()不保留「 n」的陣列

再有就是this wonderful post表示利用作爲在手冊頁FGETS(描述中提到這個職位的答案strlen()。一是通過fgets()存儲的字符數)保留\n(如果有的話),這就是爲什麼strlen()函數返回text_size + 1。我試圖通過一個程序來測試它:

#include<stdio.h> 
#include<string.h> 
#define text_size 10 
int main(void) 
{ 
    char str[text_size+1]; 
    fgets(str,sizeof(str),stdin); 
    printf("%s",str); 
    printf("%d",strlen(str)); 

    return 0; 
} 

當我大小比text_size較小的輸入文本時,strlen(str)返回值(text_size + 1)閱讀手冊頁,它保留了後是完全可以理解我文字後的\n。如對實施例: -

INPUT:你好

OUTPUT:您好6(我想\ n被這裏保留)。

但是,當作爲text_size或確切大小的I輸入文本甚至更大的尺寸由strlen(str)返回的值等於(text_size),因此10被打印出來,不知爲什麼\n此處丟棄?

輸入:helloworldhi

OUTPUT:HelloWorld的10(爲什麼這裏沒有返回11日以來1米字元的地方還是有的,這裏我就不明白它在這裏被賦予優先\0\n字符和爲什麼???

我不是很肯定在C中的所有未定義的行爲,但我們可以把它叫做一個UB?

回答

2
fgets(str,sizeof(str),stdin); 

您可以指定緩衝區的大小,因此當有太多睦h文本,它只能讀取(大小爲1)字符,爲空字符騰出空間。

看一看fgets

讀取來自流的字符,並將它們存儲爲C字符串到STR直到(NUM-1)的字符已被讀出或任一換行或最終的文件是達到,以先發生者爲準。

+0

+1鏈接。謝謝!! – 0decimal0

+0

確定然後printf()語句應該只打印文本大小爲1? – 0decimal0

+1

@PHIfounder它應該在您的示例中打印最大尺寸爲-1的文本(或者更確切地說是'text_size')。 –