C - 用于字符实现的错误检查输入

时间:2016-01-30 22:39:52

标签: c scanf

int main() {
printf("Enter a number [between 1.0 - 10.0]: ");
double lf;
for (;;) {
    printf("number = ");
    scanf("%lf", &lf);
    if (lf < 1) {
        printf("Error: number must be >= 1.000000\n");
    }
    else if (lf > 10) {
        printf("Error: number must be <= 10.000000\n");
    }
    else {
        break;
    }
}

这是我到目前为止的代码,它可以正常工作。我唯一需要帮助的是 - 在用户输入文本时添加错误检查,而不是数字。我尝试过多种方法,但我只是学习这种语言,所以我很难将其应用到现有代码中。我已经尝试过isdigit和isalpha命令,但这并不起作用。

编辑:到目前为止,我已经更改了代码以使其更加有效。虽然还有另一个问题。新代码:

int main() {
printf("\nEnter a number [between 1.0 - 10.0]: ");
double lf;
for (;;) {
    printf("number = ");
    scanf("%lf", &lf);
    if (scanf("%lf", &lf) != 1) {
        printf("Error: enter a number\n");
        int ch;
        while ((ch = getchar()) != EOF && ch != '\n');
        continue;
    }
    else if (lf < 1) {
        printf("Error: number must be >= 1.000000\n");
    }
    else if (lf > 10) {
        printf("Error: number must be <= 10.000000\n");
    }
    else {
        break;
    }
}
printf("Enter another number: ");

问题是,当我输入文字时,它会要求我再次输入该号码。因此,如果我输入&#39; 3&#39;,扫描仪会向下移动到下一行,没有提示要求输入数字。但是如果我在没有提示的情况下输入另一个数字并按下回车键,那么它会转到我输入另一个数字的最后一行代码。我怎样才能使它只通过输入一次进入打印语句?

3 个答案:

答案 0 :(得分:1)

你可以使用字符串库,更具体地说是一个名为atof()的函数,它将一个数字作为一个字符作为参数。如果提供的字符不是数字,它将返回0。所以读取数字作为字符然后你可以退出程序,如果你得到0.所以它看起来像这样:

scanf("%s",  temp);
int lf = atof(temp);
if( !lf) {
    printf("No strings allowed");
    exit(1);

}

答案 1 :(得分:1)

int main() {
printf("\nEnter a number [between 1.0 - 10.0]: ");
double lf;
for (;;) {
printf("number = ");
if (scanf("%lf", &lf) != 1) {                   //THIS IS THE FIX HERE
    printf("Error: enter a number\n");
    int ch;
    while ((ch = getchar()) != EOF && ch != '\n');
    continue;
}
else if (lf < 1) {
    printf("Error: number must be >= 1.000000\n");
}
else if (lf > 10) {
    printf("Error: number must be <= 10.000000\n");
}
else {
    break;
}
}
printf("Enter another number: ");

答案 2 :(得分:0)

这使用getline(3),它将malloc和/或重新分配缓冲区来保存输入行。这样可以省去担心截断或空终止的问题。

#define _XOPEN_SOURCE 700 // for getline(3)
#include <stdio.h>
#include <stdlib.h>

int main(void) {
        char *ln = NULL;
        size_t lnsz = 0;
        double lf;

        printf("Enter a number [between 1.0 - 10.0]: number = ");
        while (getline(&ln, &lnsz, stdin) > 0) {
                char c = 0;
                if (sscanf(ln, "%lf%c", &lf, &c) != 2 || c != '\n')
                        printf("Error: must be a number\n");
                else if (lf < 1)
                        printf("Error: number must be >= 1.000000\n");
                else if (lf > 10)
                        printf("Error: number must be <= 10.000000\n");
                else
                        break;
                printf("number = ");
        }
        printf("lf = %f\n", lf);
        free(ln);
        return 0;
}