【问题标题】:For-loop logic in order to print an inputed character using scanf n number of times循环逻辑,以便使用 scanf n 次打印输入字符
【发布时间】:2020-02-18 11:08:23
【问题描述】:

我一直试图理解这个 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&lt;2*n 的逻辑。因此,例如,当我输入n=2 后跟字符M M,并且i 初始化为0 时,检查0 &lt; 4 的条件是否为真,因此输入第一个字符M,然后@ 987654330@ 打印一次,现在 i 递增到 1 并与 1 &lt; 4 进行检查,这是真的并再次打印。现在它已经打印了两次,但是根据i &lt; 2 * n 的逻辑,在4 &lt; 4 终止for 循环之前,Monday 不应该打印4 次吗?

但是这个逻辑在某种程度上是正确的。

我对@9​​87654337@ 的逻辑由于某种原因不起作用,只能一次性输入和打印字符。我哪里错了?

【问题讨论】:

  • 字母之间有空格
  • 你能添加你的确切输入,以及你得到的输出,以及你期望的输出吗?正如@Jacob 建议的那样,您的输入中可能有额外的字符(空格或换行符,或...)。
  • 添加一个 default 案例,您 printf 接收到的 ch 值将向您显示正在发生的事情的提示。
  • 问题是代码工作正常,但我只需要帮助来理解 for 循环中使用的逻辑,以及 i

标签: c loops for-loop scanf control-flow


【解决方案1】:

scanf("%c", &amp;ch); 扫描您输入的字符,但由enter 引起的\n 换行符仍保留在缓冲区中(代码中的前一个scanf 也是如此),这会导致对于每个输入,for 循环运行 2 次:首先,它扫描字符本身,然后扫描 \n。这就是为什么您的 for 循环需要运行 4 次而不是应该运行 2 次的原因。

您需要丢弃那些\n 字符。您可以使用%*c 丢弃它们,然后您可以在for 循环中将n*2 替换为n,优点是循环运行的次数只有现在的一半。

这不仅适用于以空格分隔的块输入,而且适用于一次一个输入。

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
//...

【讨论】:

  • 知道了,因为我才刚刚开始使用 C,而且我从来不需要解决需要我根据整数输入多个测试用例的问题,所以我没有考虑空格我在执行程序时正在输入。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-11-11
  • 1970-01-01
  • 2020-12-27
  • 1970-01-01
  • 2021-02-25
  • 1970-01-01
  • 2019-08-29
相关资源
最近更新 更多