您可以考虑下面的简单程序:
int main(void)
{
//exercise 1
float num2;
printf("please enter a number \n");
scanf_s("%f", &num2);
printf("the number multiple by 3 is %3.3f\n", num2 * 3);
//exercise 2
char ch1, ch2, ch3, ch4;
printf("enter a word with four char\n");
ch1 = getchar();
ch2 = getchar();
ch3 = getchar();
ch4 = getchar();
printf("the chars in reverse order are\n");
putchar(ch4);
putchar(ch3);
putchar(ch2);
putchar(ch1);
putchar('\n');
}
输出是:
please enter a number
2
the number multiple by 3 is 6.000
enter a word with four char
ffff
the chars in reverse order are
fff
如果我将练习2的代码块移到1以上,则将3个字符打印到控制台:
int main(void)
{
//exercise 2
char ch1, ch2, ch3, ch4;
printf("enter a word with four char\n");
ch1 = getchar();
ch2 = getchar();
ch3 = getchar();
ch4 = getchar();
printf("the chars in reverse order are\n");
putchar(ch4);
putchar(ch3);
putchar(ch2);
putchar(ch1);
putchar('\n');
//exercise 1
float num2;
printf("please enter a number \n");
scanf_s("%f", &num2);
printf("the number multiple by 3 is %3.3f\n", num2 * 3);
}
预期的结果:
enter a word with four char
ffff
the chars in reverse order are
ffff
please enter a number
2
the number multiple by 3 is 6.000
我想知道为什么当我更改代码块的顺序时它会起作用,我该怎么解决它,谢谢。
答案 0 :(得分:4)
想要知道为什么当我更改代码块的顺序时它会起作用,我该如何解决呢?
那是因为scanf_s("%f", &num2);
在输入缓冲区中留下了换行符。因此,您的第一个getchar();
会将该换行解释为ch1
。
对于这种情况,前一个getchar
之前的静音会:
getchar(); // will consume the remaining newline from stdin
ch1 = getchar();
ch2 = getchar();
ch3 = getchar();
ch4 = getchar();
答案 1 :(得分:2)
输入第一个浮点数时会出现换行符,并且通过调用getchar
将其输入为char。另一种解决方法是使用fgets
将整行作为字符串,然后用您想要的任何格式解析它:
char line[512];
printf("please enter a number \n");
fgets(line, sizeof line, stdin); // the newline is consumed here
sscanf(line, "%f", &num2);
ch1 = getchar(); // working as expected