2014-01-29 126 views
4

我編寫了這個代碼,它將一個整數(t)作爲用戶的輸入。一個循環將被執行「t」次。但我發現它運行的時間爲(t-1)次。例如,如果我輸入3,則它只運行2次。任何人都可以解釋爲什麼發生這種情況?該循環將執行多少次?

我試過並使用scanf("%s", &str),它的工作原理,但我不能把一個字符串作爲包含空格的輸入。

#include <stdio.h> 
int main() 
{ 
    int t; 
    scanf("%d", &t); 
    while(t--) 
     { 
     char str[100]; 
     gets(str); 
     printf("%s\n", str); 
     } 
    return 0; 
} 
+2

不要使用'gets'函數;它本質上是不安全的,並且已從最新版本的語言中刪除。 'fgets'可以安全使用,但稍微複雜一點。 –

+0

循環體運行't'次。 – typ1232

回答

2

scanf("%d", &t)僅消耗輸入流中的數字並保留其餘字符。當您輸入一個數字並按下回車鍵時,數字後面會出現換行符。

第一個gets讀取此換行符,並返回除換行符之外爲空的字符串。循環的第一次迭代打印此空白行。

1

環路被迭代的3倍,因爲它should.But似乎它是迭代不僅因爲該\n字符在緩衝區時留下gets被讀入第二迭代的原因的2倍。
對於第一次迭代,當您輸入一個字符串並按輸入時,\n字符將轉到帶有字符串的緩衝區。當它遇到\0時,gets停止讀取,將\n留在緩衝區中。在下一次迭代中,\n(不可打印的字符)被gets讀取,然後打印到終端。


注意:千萬不要使用gets函數。它不再是標準C的一部分。改爲使用fgets

0

我想你也可以使用scanf函數來解決你的問題,即字符串在SPACE後不接受任何東西。此外,該循環正在運行(t-1)次,因爲由於使用了gets()而導致緩衝區未被清除。爲了解決這個問題,你可以使用getch()函數清除緩衝區。下面的代碼應該工作我猜,

#include <stdio.h> 
int main() 
{ 
    int t; 
    scanf("%d", &t); 
    while(t--) 
    { 
     char str[100]; 
     scanf("%[^\n]c",&str); 
     printf("%s\n", str); 
     getch(); 
    } 
return 0; 

}

在這段代碼中,getch()將通過接受無用值清除緩衝區。還考慮到scanf()scanf內的^告訴函數需要輸入該函數直到遇到^之後的字符,在這種情況下是NEW LINE的轉義序列。我嘗試過使用一些小的單詞,而不是換行符,它也起作用。希望這可以解決你的問題:)