这个循环执行多少次?

时间:2014-01-29 17:05:16

标签: c

我编写了这段代码,它以整数(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;
}

3 个答案:

答案 0 :(得分:2)

scanf("%d", &t)仅消耗输入流中的数字并留下剩余的字符。输入数字并按Enter键时,数字后面会有换行符。

第一个gets读取此换行符并返回除换行符之外的空字符串。循环的第一次迭代打印此空白行。

答案 1 :(得分:1)

循环正在迭代3次。但它似乎只迭代了2次,因为缓冲区中\n留下的gets字符在第二次迭代中被读取。
对于第一次迭代,当您输入一个字符串并按 Enter 时,\n字符将转到带有字符串的缓冲区。 gets在遇到\0时停止阅读,将\n留在缓冲区中。在下一次迭代中,\n(不可打印的字符)由gets读取,然后打印到终端。


注意:切勿使用gets功能。它不再是标准C的一部分。请改用fgets

答案 2 :(得分: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告诉函数它需要接受输入,直到遇到^之后的字符。 case是NEW LINE的转义序列。我也尝试过使用一些小字而不是换行符,它也运行良好。希望这能解决你的问题:)