tl;dr: 使用
scanf("%s\n", tictac);
时,你是要求读取一个字符串,忽略其后的所有空格字符,然后读取一个新行。问题在于,由于第一个空格字符之后的所有空格都被忽略了,因此第一个
Enter 和第二个
Enter 之间必须至少有一个非空格字符(因此在接受第二个
Enter 之前需要一些垃圾的
非空格 输入)。
这里是使用 \n 和 scanf 的一个示例用法。
char x, y;
scanf("%c", &x);
scanf("%c", &y);
printf("%c %c", x,y);
使用这个代码,您会发现输入一个字符并按下
Enter键将直接跳转到
printf
语句。这是因为第二个scanf读入了回车(本身就是一个字符)到y中。
scanf("\n%c", &y); // This is recommended to do if you have a sequence of scanfs (but not on the first one).
这里使用 \n
来匹配或忽略多余的换行符,正确的字符将被读入到变量 y 中。
现在我们来看你的代码
scanf("%s\n", tictac);
%s
命令
scanf
读取直到找到
空格字符
(
空格,制表符或换行符
),然后
在遇到非空格字符之前忽略所有空格字符。 因此,
scanf
将忽略您输入字符串时按下的
Enter键。
以及其后的任何空格字符(
尝试在第二行输入空格并按回车键。)
这意味着这将正常工作(不像char版本)
scanf("%s", tictac);
scanf("%s", tictac2);
实际上,在Windows中,因为"%s"会导致库读取输入字符串直到找到一些空格,所以等价的格式说明符是"%[^\0x20\t\n]",它指示库读取字符串直到遇到空格字符(\0x20)、制表符(\t)或换行符(\n)。
但是,由于您已明确要求scanf
匹配\n
scanf("%s\n", tictac);
^^
它会等待直到获取到另一个\n
(在非空字符后),因为第一个已被%s
使用。
using namespace std;
。即使在 C++ 中也不应该使用它。 - sobol6803