获得与预期不同的值会在循环中运行。为什么?

时间:2015-11-22 13:34:39

标签: c loops scanf

因此,该程序在循环内部接受三个值,一个int,一个float和一个char。 当它要求用户输入整数并且他们写..让我们说,“House”程序陷入无限循环。

    #include <stdio.h>

int main(void){

    int i;
    float f;
    char c;

    while(i!=99){

        printf("Enter an int, a float and a char separated by commas: ");
        int count = scanf("%d,%f,%c",&i,&f,&c);
        printf("Int is: %d, Float is: %1.f, Char is: %c",i,f,c);

        if (count != 2){
            fflush(stdin);
            printf("\nerror\n");
        }

    }

    return 0;
}

2 个答案:

答案 0 :(得分:1)

在此 -

if (count != 2){
        fflush(stdin);                  // undefined behaviour
        printf("\nerror\n");
    }

另外,count应针对3而非2进行测试(scanf 如果成功将返回3)。而不是fflush(stdin),使用它来清除输入流 -

int c;
if (count != 3){
   while((c=getchar())!='\n' && c!= EOF);
  printf("\nerror\n");
}

你还有i未初始化。因此,要么初始化它,要么使用while循环使用do-while -

do{
   //your code
  }while(i!=99);

答案 1 :(得分:1)

  • scanf()保留不被解释为要读取的数据的字符,因此在下一次迭代中,scanf()尝试再次读取字符并再次失败,然后它将导致无限循环。
  • fflush(stdin);是未定义的行为,不使用它。
  • i中使用了未初始化的i!=99,这也是未定义的行为。

试试这个:

#include <stdio.h>

int main(void){

    int i=0;
    float f=0.0f;
    char c=' ';

    while(i!=99){

        printf("Enter an int, a float and a char separated by commas: ");
        int count = scanf("%d,%f,%c",&i,&f,&c);
        printf("Int is: %d, Float is: %1.f, Char is: %c",i,f,c);

        if (count != 3){ /* adjusted to match the scanf */
            int dummy;
            while((dummy=getchar())!='\n' && dummy!=EOF); /* skip one line */
            printf("\nerror\n");
            if (dummy == EOF) break; /* there won't be any more input... */
        }

    }

    return 0;
}