scanf怪异循环

时间:2019-03-10 02:27:09

标签: c while-loop

我写了这段代码。它必须读取一个介于1到4之间的整数(在函数上定义为下限和上限),如果条件失败,则输出一些错误消息并再次询问该问题。

#include <stdio.h>
#include <stdlib.h>

int varcheck(double x, char z, int lowerbound, int upperbound);

int main(){

    double playerCount;
    char i;

    printf("Insert Number of Players: ");
    scanf("%lf%c", &playerCount, &i);

    while(varcheck(playerCount, i, 1, 4) == 0){
        printf("Invalid Number of Players\n");
        printf("Insert Number of Players: ");
        scanf("%lf%c", &playerCount, &i);
    } 
    // ...Code continues...
}




int varcheck(double x, char z, int lowerbound, int upperbound){
    double r = 0;
    r = x - (int)x;  /*If r == 0 then its not decimal number*/ 

    if(r != 0 || z != '\n' || x < lowerbound || x > upperbound){
        return 0;
    } else {
        return 1;
    }
}

函数进入怪异循环,有人可以帮我解决这个问题吗?

2 个答案:

答案 0 :(得分:1)

首先,这段代码是一团糟。

  1. 您尚未终止任何引用的部分(在printfscanf中)
  2. 没有缩进
  3. double使用playerCount
  4. 由于它是double,它的价值可能类似于12.000001,因此r可能永远不会是0
  5. 当您必须分析getcharscanf和“ \t”(空格)之类的字符时,建议使用\n而不是
  6. 我想再次检查此部分:x < lowerbound || x > upperbound,因为我认为您打算这样做:x > lowerbound || x < upperbound

修复这些问题,我的代码应该可以正常工作。缩进与准确性无关。

答案 1 :(得分:0)

函数scanf难以解析用户输入。一个问题是scanf如果无法解析您要查询的对象,则使输入流完整/不变。示例-如果您输入“ aaa2”并尝试扫描浮点数scanf将为您提供零结果,并且输入流仍将保留“ aaa2”。因此,下一个scanf也将看到数据“ aaa2”,并且您将遇到无限循环。

解决方案是在转换失败时刷新输入流。可能是这样的:

#include <stdio.h>
#include <stdlib.h>

void flushInput()
{
    // Keep reading from input stream until a newline is read
    int c;
    do
    {
        if ((c = getchar()) == EOF) exit(1);
    } while (c != '\n');
}

int getInt()
{
    int n;
    char c;
    while(1)
    {
        // scanf will return 2 if the conversion is succesful, i.e.
        // if it could scan first an integer and then a character
        if (scanf("%d%c", &n, &c) == 2 && c == '\n') return n;

        // Conversion failed so flush the input stream
        flushInput();
    }
}

int main(void) {
    int n;
    int lowerbound = 1;
    int upperbound = 4;
    do
    {
        n = getInt();
    } while (n < lowerbound || n > upperbound);
    printf("n=%d\n", n);
    return 0;
}

输入:

4.2

aaaa2
9
3a
2

输出:

n=2