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