【发布时间】:2015-12-15 02:15:33
【问题描述】:
我使用 switch case 语句编写了一个程序,并要求输入一个字符,但它没有在控制台窗口中要求字符,而是完全跳过它
int main()
{
float a, b, ans;
char opr;
printf("\nGIVE THE VALUES OF THE TWO NUMBERS\n");
scanf(" %f %f",&a,&b);
printf("\nGIVE THE REQUIRED OPERATOR\n");
//no display(echo) on the screen
//opr = getch();
//displays on the screen
//opr = getche();
scanf("%c",&opr);
switch(opr)
{
case '+' :
ans = a+b;
printf("%f", ans);
break;
case '-' :
ans = a-b;
printf("%f", ans);
break;
case '*' :
ans = a*b;
printf("%f", ans);
break;
case '/' :
ans = a/b;
printf("%f", ans);
break;
case '%' :
ans = (int)a % (int)b;
printf("%f", ans);
break;
default :
printf("\nGIVE A VALID OPRATOR\n");
}
system("pause");
return 0;
但是当我在第二个scanf 中在%c 之前放置一个空格时,它起作用了,有人在讲述一个我发现令人困惑的空白
他说第二个scanf 将\n 的值作为一个字符,如果我在第二个%c 之前放一个空格scanf 不是那个字符,它不占用空间作为字符?
但在这个程序中,它没有将\n 作为字符
int main()
{
char a;
printf("\ngive a char\n");
scanf("%c",&a);
printf("%c",a);
return 0;
}
这真的很令人困惑,任何人都可以帮助我了解问题所在。
【问题讨论】:
-
这可能是您在插入两个数字后输入的“换行符”字符。输入就像一个缓冲区队列。它排列字符。在这种情况下,您告诉它将第一个数字读入 &a ,跳过中间的任何内容,将第二个数字读入 &b,然后读下一个字符。由于在 &b 中输入数字后,我猜你点击了“ENTER”,所以它会将“换行符”读入 &opr。解决此问题的一种快速方法是添加另一行 'scanf("%c",&opr);'紧接在您的 scanf 操作线之后。
-
在第二个
scanf中的%c之前放置一个空格。 stackoverflow.com/questions/13275417/… -
不要使用
scanf。 c-faq.com/stdio/scanfprobs.html -
空白是任何“空”字符。像空格和制表符。所以
scanf(" %c", &opr). -
@Washington Guedes 如果您使用
scanf("%s", a);,请将a的类型更改为char[2];。另外,scanf("%1s", a);,缓冲溢出风险降低更好。
标签: c char switch-statement scanf dev-c++