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 分隔的块输入,而且适用于一次一个输入。
//...
scanf("%d%*c", &n); //<-- dicard newline character
for (i = 0; i < n ; i += 1) {
scanf("%c%*c", &ch); //<-- discard newline character
//...
我一直试图理解这个 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 分隔的块输入,而且适用于一次一个输入。
//...
scanf("%d%*c", &n); //<-- dicard newline character
for (i = 0; i < n ; i += 1) {
scanf("%c%*c", &ch); //<-- discard newline character
//...