【问题标题】:How to make user input correctly如何正确进行用户输入
【发布时间】:2020-10-25 13:03:50
【问题描述】:

问题是关于您可以在下面看到的代码部分。我有两个变量leftLimitrightLimit。它们的值应严格从 -1 到 1(不包括在内)。好的,我解决了这个问题。当输入 >= 大于 |1| 时程序将询问直到输入所需的值。但它仅在输入具有数字值时才有效。当输入为a/ 等时,我得到程序的结尾并且没有任何效果。我该如何解决?如何防止我的程序出现非数字输入?

#include <stdio.h>
#include <math.h>
int main() {
double leftLimit, rightLimit;
printf("Enter the left limit: ");
scanf ("%lf", &leftLimit);
while (fabs(leftLimit)>=1) {                
    printf("\nYou typed a wrong limit, try again: ");
    scanf("%lf", &leftLimit);
}
printf("\nEnter the right limit: ");
scanf("%lf", &rightLimit);


while (fabs(rightLimit)>=1) {                 
    printf("\nYou typed a wrong limit, try again: ");
    scanf("%lf", &rightLimit);
}

【问题讨论】:

    标签: c clion


    【解决方案1】:

    scanf() 不适合用户输入。 首选fgets() 可能后跟sscanf()strtol()strtod()

    double leftLimit;
    char buffer[1000];
    for (;;) {
        printf("Enter left limit: ");
        fflush(stdout);
        if (!fgets(buffer, sizeof buffer, stdin)) exit(EXIT_FAILURE);
        char *err;
        leftLimit = strtod(buffer, &err);
        if (*err != '\n') continue;
        if (fabs(leftLimit) >= 1) continue;
        break; // all ok
    }
    printf("Accepted left limit of %f.\n", leftLimit);
    

    【讨论】:

    • 它不起作用,它无休止地要我输入左限制,即使输入是正确的。 fflush(stdout) 是做什么的?
    • 我的错...*err 必须是 ENTER,而不是 '\0',代码已更正
    • fflush(stdout); 强制在屏幕上显示上述提示。通常stdout 是行缓冲的,而"Enter left limit: " 没有换行符,因此它可能会卡在stdout 缓冲区中
    • 但我还有一些关于你的问题if (!fgets(buffer, sizeof buffer, stdin)) exit(EXIT_FAILURE);。我或多或少可以理解这部分:(!fgets(buffer, sizeof buffer, stdin)) ,但我根本不理解exit(EXIT_FAILURE)。我只是在学习 C 的早期阶段,所以如果你能解释一下,或者至少给我链接,我可以在那里学习它,我将不胜感激。对不起,无礼,谢谢。
    • 这只是错误管理 --- 在极不可能发生的输入错误事件中(网络故障、牛奶溅到键盘上、猫咀嚼电缆……),在这种情况下 fgets() 返回 @ 987654338@,退出程序而不是一直尝试。一些(大多数??)人,自信地(!!!),只是在这里跳过错误验证:)
    猜你喜欢
    • 1970-01-01
    • 2017-01-24
    • 2021-12-28
    • 2014-07-09
    • 2012-09-22
    • 1970-01-01
    • 1970-01-01
    • 2020-02-13
    • 1970-01-01
    相关资源
    最近更新 更多