C语言 用于循环逻辑,以便使用 scanf n 次打印输入的字符



我一直试图理解这个循环背后的逻辑,但我无法理解。该问题要求输入一个整数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
//...

相关内容

  • 没有找到相关文章

最新更新