2012-06-24 107 views
2

使用fgets來輸入一個字符串,我懷疑與字符串讀取的長度有關。fgets最大文件大小讀取

例如,考慮以下程序。

char str[50]; 
int i; 
int len; 
printf("Enter name:\n"); 
fgets(str,11,stdin); 
len = strlen(str); 
printf("len : %d\n",len); 
  1. 如果我進入123456789strlen給10

  2. 如果我進入1234567890,給予strlen是10再次??

我認爲strlen正在考慮換行符也用於字符串長度。我對麼? (我理解fgets使用換行符作爲字符串的一部分)

(2)在輸入正好10個字符時,這裏字符串長度應該是11對嗎? 10 + 1(用於換行)= 11

+0

的printf( 「LEN:%d」,LEN); printf(「str:%s」,str); \t printf(「hi」); return 0; }添加少量印刷有助於澄清下面給出的答案。注意如何打印「hi」。 – kumar

回答

4

fgets讀取至多1個比給出的長度的參數更少的字符,和保留換行符作爲輸入的一部分 - 只要換行符是第一部分(長度 - 1)個字符。

所以在你的第一種情況下,假設123456789後跟一個換行符,fgets已經讀取了9個字符,包括換行符,產生一個10的字符串長度;在第二種情況下,將fgets讀取10個字符之後1234567890停止,得到10

+1

次要校正:它會*不會*保留換行符如果#/字符> =最大長度。如下例所示。 – paulsm4

+1

@ paulsm4我相信這是已經從我的第一線清晰:比長度參數given_ _reads最多1個字符。 – pb2q

1

這裏的字符串長度是一個例子:

#include <stdio.h> 
#include <string.h> 

#define MAX_DIGITS 5 

int 
main() 
{ 
    char buf[80]; 
    char *s = NULL; 
    printf ("\n>>Enter string, %d digits or less: ", MAX_DIGITS); 
    s = fgets (buf, MAX_DIGITS+1, stdin); 
    printf ("strlen(buf)=%d, buf=%s, strlen(s)=%d, s=%s\n", 
    strlen(buf), buf, strlen(s), s); 
    return 0; 
} 

輸出樣本,以「MAX_DIGITS」和「MAX_DIGITS + 1 「:

>>Enter string, 5 digits or less: 1 
strlen(buf)=2, buf=1 
, strlen(s)=2, s=1 
. 

>>Enter string, 5 digits or less: 12 
strlen(buf)=3, buf=12 
, strlen(s)=3, s=12 
. 

>>Enter string, 5 digits or less: 123 
strlen(buf)=4, buf=123 
, strlen(s)=4, s=123 
. 

>>Enter string, 5 digits or less: 1234 
strlen(buf)=5, buf=1234 
, strlen(s)=5, s=1234 
. 

>>Enter string, 5 digits or less: 12345 
strlen(buf)=5, buf=12345, strlen(s)=5, s=12345. 

>>Enter string, 5 digits or less: 123456 
strlen(buf)=5, buf=12345, strlen(s)=5, s=12345. 

你會發現:

  1. 的返回b只要#/位是< MAX_DIGITS,uffer就會保留「\ n」。

  2. 當#/ digits> = MAX_DIGITS時,「\ n」被刪除。

  3. 你的緩衝區必須容納MAX_DIGITS + 1

+0

<<您的緩衝區必須容納MAX_DIGITS + 1。所以緩衝區也應該有足夠的空間來存儲新行,也就是+1。謝謝你的幫助。 – kumar

+0

@kumar要存儲換行符是應該是+ 2作爲與fgets已經帶走一個用於存儲空終止值 - >「\ 0」;也就是說,如果你通過它6,它最多可以讀取5個東西(4個數字+ CR或5個數字)。如果您通過它7將讀取5個數字加上回車。 – Scooter

-1

其實fgets需要在字符串的結尾size規範(你的情況11)佔\0。從fgets手冊頁:

與fgets()從流,並將它們存儲比大小的字符最多一個少 讀取到緩存由 小號指向。讀取在EOF或換行符後停止。如果讀取換行符 ,則將其存儲到緩衝區中。在緩衝區中的最後一個字符之後存儲空字符('\ 0')爲空的 。

所以我們知道,當您輸入123456789\n時,閱讀停止在\n。然而,當你進入1234567890\nfgets()處理輸入,但只佔用了10個字符,而忽略其他一切之後。

任何額外的字符串輸入和您的字符串將在size-1fget()與最後一個字符\0所以輸出保持不變。