我一直试图理解这个循环背后的逻辑,但我无法理解。该问题要求输入一个整数n
(测试用例数),后跟 n 个字符,每个字符表示星期几。所以我需要输出一天 n 次。
#include <stdio.h>
int main()
{
int n, i;
char ch;
scanf("%d",&n);
for (i = 0; i < 2 * n; i += 1)
{
scanf("%c", &ch);
switch (ch)
{
case 'M':
printf("Mondayn");
break;
case 'T':
printf("Tuesdayn");
break;
case 'W':
printf("Wednesdayn");
break;
case 'H':
printf("Thursdayn");
break;
case 'F':
printf("Fridayn");
break;
case 'S':
printf("Saturdayn");
break;
case 'N':
printf("Sundayn");
break;
}
}
return 0;
}
我不明白i<2*n
的逻辑.因此,例如,当我输入n=2
后跟字符M M
,并且i
初始化为0
时,检查0 < 4
的条件,这是真的,因此输入第一个字符M
,并且Monday
打印一次,现在i
递增到1
并根据1 < 4
进行检查,这是真的并再次打印。现在它已经被打印了两次,但根据i < 2 * n
逻辑,Monday
不应该打印 4 次,直到4 < 4
终止 for 循环?
但是这种逻辑以某种方式正常工作。
我的逻辑i <= n
,由于某种原因不起作用,只能输入和打印一次字符。我哪里出错了?
scanf("%c", &ch);
扫描您输入的字符,但由enter
引起的n
换行符仍保留在缓冲区上(代码中的前scanf
也是如此),这会导致 for 循环为每个输入运行 2 次:首先,它扫描字符本身,然后扫描n
。这就是为什么您的for
循环需要运行 4 次而不是应该运行 2 次的原因。
您需要丢弃这些n
字符。您可以使用%*c
丢弃它们,然后您可以在for
循环中用n
替换n*2
,优点是循环的运行时间只有您现在的一半。
这不仅适用于由空格分隔的块输入,也适用于一次一个输入。
链接到实时样本
//...
scanf("%d%*c", &n); //<-- dicard newline character
for (i = 0; i < n ; i += 1) {
scanf("%c%*c", &ch); //<-- discard newline character
//...