For 循环逻辑,以便使用 scanf n 次打印输入的字符

For-loop logic in order to print an inputed character using scanf n number of times

我一直试图理解这个 for 循环背后的逻辑,但我一直无法理解。该问题要求输入一个整数 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("Monday\n");
            break;
        case 'T':
            printf("Tuesday\n");
            break;
        case 'W':
            printf("Wednesday\n");
            break;
        case 'H':
            printf("Thursday\n");
            break;
        case 'F':
            printf("Friday\n");
            break;
        case 'S':
            printf("Saturday\n");
            break;
        case 'N':
            printf("Sunday\n");
            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); 扫描你输入的字符,但是 \n 换行符,由 enter 引起的,保留在缓冲区中,(同样适用于前面的 scanf 在你的代码中),这会导致 for 循环为每个输入 运行 2 次:首先,它扫描字符本身,然后扫描 \n。这就是为什么你的 for 循环需要 运行 4 次而不是它应该的 2 次的原因。

您将需要丢弃那些 \n 个字符。可以用%*c舍弃,然后在for循环中用n替换n*2,好处是循环运行只用了一半你现在拥有的时间。

这不仅适用于由 space 分隔的块输入,而且适用于一次一个输入。

Link to live sample

//...
scanf("%d%*c", &n); //<-- dicard newline character

for (i = 0; i < n ; i += 1) {
    scanf("%c%*c", &ch); //<-- discard newline character
//...