2012-10-16 43 views
2

我試圖讓這個代碼來驗證用戶輸入的值。它工作,如果我使用gets(),但當我改變它fgets()它停止工作。我希望它保持循環,直到用戶輸入一個至少包含1個字符但小於25的字符串。如果在我的代碼中不明顯,我是編程新手。謝謝!如何確保用戶輸入一個值?

int main(void) 
{ 
    char input[25], inputNew[25]; 
    int i; 
    int x; 
    int y; 
    do 
    { 
     printf("Please enter a string less then 25 characters!\n"); 
     fgets(input, sizeof(input), stdin); 
     y = strlen(input); 
    } 
    while(y>25 || y<=0); 

    for (i = 0; i <= strlen(input); i++) 
    { 
     inputNew[i] = toupper(input[i]); 
     for (x = 1; x <= strlen(input); x+=2) 
     { 
     inputNew[x] = tolower(input[x]); 
     } 
    } 
    printf("The new value is: %s.\n", inputNew); 
return 0; 
} 
+0

你可以使用'getline',有你'input'是'malloc'-ED指針。 –

+0

...如果你願意去glibc只。 – nneonneo

+0

將字符輸入[25]的變量大小更改爲大於25的值。檢查此答案(http://stackoverflow.com/a/12907742/937420) – Antarus

回答

6

fgets保持結尾換行,而gets拋出了出來。

因此,如果您使用fgets,則必須將支票更改爲y <= 1

0

nneonneo打我的回答:

將獲得()函數等同於與fgets()具有無限的大小和 標準輸入的 流,除了換行符(如果有的話)不存儲 在字符串中。

http://www.manpagez.com/man/3/fgets/

我剛添加的引用...

1

首先,避免任何嚴重的代碼gets()gets()設計不合理,不安全。切勿使用它。

二。 fgets()將新行保留在緩衝區的末尾(而gets()將其丟棄)。

第三,y <= 0fgets()的情況下可能是錯誤的,因爲它可能會讀取至少一個字符(換行符)。您應該用y < 2替換它。

最後和最重要重要:請縮進您的代碼。 :)

0

您已聲明變量輸入的靜態大小爲25。所以我沒有看到y = strlen(input)獲得更大尺寸的機會;

更改

char input[25]; 

char input[100]; 

任何超過25

相關問題