我使用gcc-4.7在Centos 6.5上编写了以下C代码,但程序没有等待类型Y / N:语句在结果后立即退出。其中任何一个代码都不起作用。
#include <stdio.h>
int main()
{
int a,b;
char ch='y';
do
{
printf("Enter Number 1:\n");
scanf("%d",&a);
printf("Enter Number 2:\n");
scanf("%d",&b);
printf("Result is:%d\n",a+b);
printf("Type y/N:\n");
scanf("%c",&ch);
}while(ch=='y' || ch=='Y');
}
return 0;
}
OR
#include<stdio.h>
int main()
{
int a,b;
char ch='y';
while(ch=='y' || ch=='Y')
{
printf("Enter Number 1:\n");
scanf("%d",&a);
printf("Enter Number 2:\n");
scanf("%d",&b);
printf("Result is:%d\n",a+b);
printf("Type y/N:\n");
scanf("%c",&ch);
}
return 0;
}
答案 0 :(得分:5)
执行时:
scanf ("%d", &b);
并输入,例如42<enter>
,读取42
并将<enter>
留在输入缓冲区中。
然后它被scanf("%c",&ch);
拾取,这是在尝试阅读之前没有跳过空格的格式字符串之一。来自C99 7.19.6.2 /8
,但在C11中基本没有变化:
跳过输入的空白字符(由isspace函数指定),除非规范包含[,c或n说明符。
许多输入说明符倾向于在开始读取实际数据之前跳过空格,c
是例外之一。
对于像这样的简单代码,你可以可能使用格式字符串中的空格,因为(来自同一部分/5
):
由空白字符组成的指令通过读取第一个非空白字符(仍然未读取)的输入来执行,或者直到不再能够读取字符为止。
所以,你会使用类似的东西:
scanf (" %c", &ch);
如果输入47b
这样的数字,那么不会有所帮助: - )
在某些时候,每个C开发人员都意识到标准输入机制的不足之处,writes their own。
答案 1 :(得分:2)
您的问题是:%c
不会跳过前导空格,因此如果输入流中有换行符(即来自您之前的scanf
条目,即您的情况下的数字2),那么{{ 1}}调用将立即消耗它。
解决此问题的一种方法是在格式字符串中的说明符之前放置一个空格:
scanf
格式字符串中的空白告诉scanf(" %c", &c);
跳过前导空格。