为什么循环运行一次?

时间:2014-01-20 12:55:11

标签: c

#include <stdio.h>
main()

{
    int num;
    char another="y";
    for(;another=="y";)
    {
        printf("no. is ");
        scanf("%d", &num);
        printf("sq. of %d is %d", num,num*num);
        printf("\nWant to enter another no. : y/n");
        scanf("%c", &another);
    }
}

我有这样的C代码。根据我的说法,这应该是这样的:输入no并给出正方形。但它也无法在无限循环中运行。但它只运行一次。为什么呢?

我在Windows 64位上使用GCC4.8.1编译器。

2 个答案:

答案 0 :(得分:2)

因为在第二次迭代时scanf\n分配给another而不是分配y

说明:键入输入后按 Enter 键,然后还有一个字符与输入的输入一起进入缓冲区。此字符由 Enter 生成,并且为\n。假设您键入y然后按 Enter 键,则缓冲区将包含y\n,即两个字符y\n。<登记/> 执行scanf("%d", &num);时,它会读取输入的数字,并在缓冲区中留下\n字符,以便下次调用scanf。无论您在控制台中输入了什么,下一个\n来电scanf都会读取此scanf("%c", &another);

要占用这一新行char,请在%c中的scanf说明符之前使用空格。

scanf(" %c", &another); 
       ^Notice the space before %c.  

并改变

for(;another=="y";) {...}  // Remove the double quote. 

for(;another=='y';) {...}   // Single quote is used for `char`s.

答案 1 :(得分:0)

循环中的测试是错误的:

another=="y"

another(单个字符)的值与字符串文字的值进行比较,该值将被重新指定为指向字符y的指针。它应该是:

another == 'y'

你应该为此获得编译器警告,因为将小整数与指针进行比较是非常奇怪的。