C中do-while循环的意外行为?

时间:2013-11-22 07:27:30

标签: c loops while-loop turbo-c++ turbo-c

我用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);

但另一个人的价值从未打印过。 该程序直接退出

2 个答案:

答案 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()