在while循环中使用“continue”,跳过scanf(“%d”,var)

时间:2016-09-11 05:47:14

标签: c

所以我在我的C程序中使用视觉工作室。

while循环以提示和scanf开始,如果用户输入非数字响应,则循环中的开关/大小写将变为默认值。这会打印错误并“继续”循环。

问题是,当循环继续到下一次迭代时,它会完全跳过“scanf”,然后无限循环通过默认情况。我搜索了几个小时但似乎无法找到解决方案。

我的目标是在切换/案例后跳过代码,然后返回到开头。任何帮助将不胜感激。

while (userInput != 'N' && userInput != 'n') {

    printf("Enter input coefficients a, b and c: "); // prompt user input
    scanf_s("%d %d %d", &a, &b, &c); // look for and store user input

    /* ----- Break up the quadratic formula into parts -----*/

    inSqRoot = (pow(b, 2) - (4.0 * a * c)); // b^2 - 4ac
    absInSqRoot = abs((pow(b, 2) - (4.0 * a * c))); // absolute value of b^2 - 4ac
    denom = 2.0 * a; // get denomiator 2.0 * a
    negB = -1.0 * b; // take negative of b

    /*------ Determine number of roots -------*/

    if (!isdigit(a) || !isdigit(b) || !isdigit(c)) {

        rootNum = 4;

    }  // end if

    else if (a == 0 && b == 0 && c == 0) {

        rootNum = 0;
    } // end if

    else if (inSqRoot == 0) {

        rootNum = 1;
    } // end if

    else if (inSqRoot > 0) {

        rootNum = 2;
    } // end if

    else if (inSqRoot < 0) {

        rootNum = 3;

    } // end if


    /*------ Begin switch case for rootNum ------*/

    switch (rootNum) {

    case 0: // no roots

        printf("The equation has no roots.\n");
        break;

    case 1: // one root

        root1 = (-b + sqrt(inSqRoot)) / denom;

        printf("The equation has one real root.\n");
        printf("The root is: %.4g\n", root1);
        break;

    case 2: // two roots

        root1 = (-b + sqrt(inSqRoot)) / denom;
        root2 = (-b - sqrt(inSqRoot)) / denom;

        printf("The equation has two real roots.\n");
        printf("The roots are: %.4g and %.4g\n", root1, root2);
        break;

    case 3: // imaginary roots

        printf("The equation has imaginary roots.\n");
        printf("The roots are: %.1g + %.4gi and %.1g - %.4gi \n", negB / denom, sqrt(absInSqRoot) / denom, negB / denom, sqrt(absInSqRoot) / denom);
        break;

    default:
        printf("ERROR: The given values are not valid for a quadratic equation.\n");
        continue;
    }

    printf("Enter Y if you want to continue or N to stop the program: ");
    scanf_s("%*c%c", &userInput);
    printf("\n");
}

2 个答案:

答案 0 :(得分:2)

scanf实际上没有被跳过,它只是一遍又一遍地读取相同的错误输入。您可以使用scanf的返回值来查看读取的参数数量。在输入错误的情况下,它将小于3.要刷新错误的输入,您可以调用这样的函数

void flushInput() {
    int c;
    while ((c = getchar()) != '\n' && c != EOF);
}

并在默认情况下添加对flushInput的调用

default:
    printf("ERROR: The given values are not valid for a quadratic equation.\n");
    flushInput();
    continue;

答案 1 :(得分:0)

通常,在涉及用户输入时,阅读和验证用户输入对于编写性能良好的应用程序至关重要。用户可能会提交不完美的输入,您的应用程序应该检查这一点。

scanf()可能不是最佳选择,因为它是一个蒸汽输入,而不是控制台输入功能,并且没有表现出所需的方式:

  • 处理空白和换行符
  • 只有在读取和分配了所有变量或遇到文件结束符(Ctrl + Z)时,
  • 才会返回。

所以我的建议是使用选择的console-I / 0函数,即gets()(或其“安全”形式gets_s())。这个行为符合要求,因为它只读取整行文本,并在按下Enter时返回(scanf()甚至可以从下一行读取参数)。

然后使用sscanf(),它就像scanf(),但是从缓冲区读取变量,然后返回读取和分配的变量数。您可以使用“%d%d&amp; d%s”作为格式字符串,以便检查用户是否输入了3个变量,而不是更少甚至更多...(第四个变量将是一个虚拟字符串,如果用户提交乱码输入,则仅用于使sscanf()返回3以上。