我编写了这段代码,它以整数(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;
}
答案 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
的转义序列。我也尝试过使用一些小字而不是换行符,它也运行良好。希望这能解决你的问题:)