我用C语言解决了一个编程问题,在一本书中出现了
代码如下: -
#include<stdio.h>
#include<conio.h>
void main()
{
int num;
char another;
do
{
printf("Enter a Number");
scanf("%d",&num);
printf("Square Of The Entered Number Is = %d",num*num);
printf("Do You Still Want To continue (y/n)");
scanf("%c",&another);
}while(another=='y');
getch();
}
现在我在“TurboC ++ MSDOSBox for Windows 7”中运行此程序
即使我在下列声明“你还想继续(y / n)”之后输入“y”,程序也会退出
看起来好像它没有在这个之后执行任何语句
scanf("%c",&another);
因为我在此之后添加了另一个声明: -
scanf("%c",&another);
printf("another is = %c",another);
但另一个人的价值从未打印过。 该程序直接退出
答案 0 :(得分:4)
这里的问题是当你扫描数字时,它会在输入缓冲区中留下你输入结束的换行符。因此,当您稍后扫描该角色时,它将读取该换行符。
修复非常简单:在阅读角色之前,告诉scanf
跳过前导空格(包括换行符)。这是通过在格式代码前面添加一个空格来完成的:
scanf(" %c",&another);
/* ^ */
/* | */
/* Note space */
当您输入第一个scanf
调用的号码时,会有一个看起来像
+--+--+--+--+ | 1| 2| 3|\n| +--+--+--+--+
如果输入数字123
。在scanf
函数读取数字后,缓冲区将显示为
+--+ |\n| +--+
换句话说,它只包含换行符。现在当你执行第二个scanf
来读取一个字符时,scanf
函数会看到这个换行符,因为它是一个字符,它很高兴并在another
变量中返回该换行符
在scanf
格式字符串中添加空格的方法是告诉scanf
跳过任何空格,包括换行符,回车符,空格和制表符。然后它会找到你想要输入的字符并阅读它。
此外,大多数格式说明符会自动跳过前导空格,例如"%d"
说明符。但是当扫描字符时,这是不可能的,因为调用者可能实际上想要换行符。
答案 1 :(得分:0)
另一种简单的方法是使用专门用于阅读字符的功能
将scanf("%c",&another);
替换为another=getch();
或another=getchar()