2014-01-29 62 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的转义序列。我尝试过使用一些小的单词,而不是换行符,它也起作用。希望这可以解决你的问题:)