如何使用C代码拒绝非数字输入?

如何使用C代码拒绝非数字输入?,c,cs50,C,Cs50,我使用cs50.io(c)编写了一个代码。唯一的问题是,每当我在终端中检查50时,我都会收到一条错误消息,表明拒绝非数字输入+预期输入。。。这是我的代码,下面是终端中的错误。任何帮助都将不胜感激 #include <stdio.h> int main() { float celsius, fahrenheit; printf("\nEnter temp in Celsius : "); scanf("%f", &celsius); fah

我使用cs50.io(c)编写了一个代码。唯一的问题是,每当我在终端中检查50时,我都会收到一条错误消息,表明拒绝非数字输入+预期输入。。。这是我的代码,下面是终端中的错误。任何帮助都将不胜感激

#include <stdio.h>

int main() {
    float celsius, fahrenheit;

    printf("\nEnter temp in Celsius : ");
    scanf("%f", &celsius);

    fahrenheit = (1.8 * celsius) + 32;
    printf("F: %.1f\n", fahrenheit);

    return (0);     
}
#包括
int main(){
浮动摄氏度,华氏度;
printf(“\n输入温度,单位为摄氏:”);
scanf(“%f”&摄氏度);
华氏温度=(1.8摄氏度)+32;
printf(“F:%.1f\n”,华氏度);
返回(0);
}

您可以检查
scanf()
的返回值

缺点是,
scanf()
通常很难处理后续输入,因为它忽略了空格字符,您需要手动将它们从
stdin
中删除

我喜欢的方式是

char buffer[100];
float value;
char *endptr;
if (fgets(buffer, sizeof(buffer), stdin) == NULL)
    return -1; // Something went wrong (Ctrl+Z/Ctrl+D -> EOF) perhaps
// Check if non numeric characters are present.
value = strtod(buffer, &endptr);
if (((isspace(*endptr) != 0) && (*endptr != '\0')) || (buffer == endptr))
    fprintf(stderr, "non numeric input rejected.\n"); // ^ no conversion happened
else
    fprintf(stderr, "good the input is a number `%f'.\n", value);
但这也不是完美的,因为
“123.456示例”
将被视为一个数值。严格地处理它是可能的,但需要更多的工作。但我认为这些例子说明了问题所在。

您可以检查
scanf()
的返回值

缺点是,
scanf()
通常很难处理后续输入,因为它忽略了空格字符,您需要手动将它们从
stdin
中删除

我喜欢的方式是

char buffer[100];
float value;
char *endptr;
if (fgets(buffer, sizeof(buffer), stdin) == NULL)
    return -1; // Something went wrong (Ctrl+Z/Ctrl+D -> EOF) perhaps
// Check if non numeric characters are present.
value = strtod(buffer, &endptr);
if (((isspace(*endptr) != 0) && (*endptr != '\0')) || (buffer == endptr))
    fprintf(stderr, "non numeric input rejected.\n"); // ^ no conversion happened
else
    fprintf(stderr, "good the input is a number `%f'.\n", value);

但这也不是完美的,因为
“123.456示例”
将被视为一个数值。严格地处理它是可能的,但需要更多的工作。但是我认为这些例子说明了问题所在。

简单地检查
scanf(“%f”,…)的返回值的问题是指您不会捕获在其他有效字符之后的无效字符。这个解决方案比其他的更简单,并且在数字输入之前或之后,或者在数字输入之后捕获无效字符:

编辑:per@-


如果任何非数字字符后跟其他有效的数字字符,则在
baddet
中捕获第一个此类字符。在你的情况下,你应该捕捉一个换行符;在其他情况下(例如处理命令行参数),您可能希望数字字符后面完全没有空格;在这种情况下,
scanf()
的返回值应该是1,
baddet
中的值实际上并不重要(尽管将其地址传递给
scanf()
非常重要,以防在其他数字输入字符后面有任何非数字字符).

简单检查
scanf(“%f”,…)的返回值的问题是指您不会捕获在其他有效字符之后的无效字符。这个解决方案比其他的更简单,并且在数字输入之前或之后,或者在数字输入之后捕获无效字符:

编辑:per@-


如果任何非数字字符后跟其他有效的数字字符,则在
baddet
中捕获第一个此类字符。在你的情况下,你应该捕捉一个换行符;在其他情况下(例如处理命令行参数),您可能希望数字字符后面完全没有空格;在这种情况下,
scanf()
的返回值应该是1,
baddet
中的值实际上并不重要(尽管将其地址传递给
scanf()
非常重要,以防在其他数字输入字符后面有任何非数字字符).

编辑:在您发布的代码中,没有检查
scanf
是否实际工作。当我输入
foo
时,代码继续,没有从文本转换为
浮点摄氏度
。但是,
摄氏度
从未初始化,因此行为未定义。在我的例子中,代码打印为
32.0
,因为
摄氏度
刚好有一个值
0.0

您应该检查
scanf
是否按预期执行,在您的示例中,它应该返回值
1
。您还可以通过扫描以下字符(如下所示)来检查终止文本到
float
转换的字符是否是您期望的字符

#include <stdio.h>

int main(void) {
    float celsius, fahrenheit;
    char nextch;

    printf("\nEnter temp in Celsius : ");
    if (scanf("%f%c", &celsius, &nextch) != 2 || nextch != '\n') {
        printf("Bad entry\n");
    }
    else
    {
        fahrenheit = 1.8 * celsius + 32;
        printf("F: %.1f\n", fahrenheit);
    }
    return 0;     
}
#包括
内部主(空){
浮动摄氏度,华氏度;
char-nextch;
printf(“\n输入温度,单位为摄氏:”);
如果(扫描频率(“%f%c”、&c、&nextch)!=2 | | nextch!='\n'){
printf(“错误输入\n”);
}
其他的
{
华氏温度=1.8摄氏度+32摄氏度;
printf(“F:%.1f\n”,华氏度);
}
返回0;
}

函数
scanf
现在有2个格式说明符,因此它的返回值应该是
2
,并且以下字符被检查为
换行符编辑:在您发布的代码中,没有检查
scanf
是否实际工作。当我输入
foo
时,代码继续,没有从文本转换为
浮点摄氏度
。但是,
摄氏度
从未初始化,因此行为未定义。在我的例子中,代码打印为
32.0
,因为
摄氏度
刚好有一个值
0.0

您应该检查
scanf
是否按预期执行,在您的示例中,它应该返回值
1
。您还可以通过扫描以下字符(如下所示)来检查终止文本到
float
转换的字符是否是您期望的字符

#include <stdio.h>

int main(void) {
    float celsius, fahrenheit;
    char nextch;

    printf("\nEnter temp in Celsius : ");
    if (scanf("%f%c", &celsius, &nextch) != 2 || nextch != '\n') {
        printf("Bad entry\n");
    }
    else
    {
        fahrenheit = 1.8 * celsius + 32;
        printf("F: %.1f\n", fahrenheit);
    }
    return 0;     
}
#包括
内部主(空){
浮动摄氏度,华氏度;
char-nextch;
printf(“\n输入温度,单位为摄氏:”);
如果(扫描频率(“%f%c”、&c、&nextch)!=2 | | nextch!='\n'){
printf(“错误输入\n”);
}
其他的
{
华氏温度=1.8摄氏度+32摄氏度;
printf(“F:%.1f\n”,华氏度);
}
返回0;
}
作用