我仍在学习编程,所以很抱歉如果有一个简单的问题。我这里有一个确定数字是否可以被23整除的程序。但是,如果有人输入一个字符(偶然发生),例如“ u”,它会错误地显示它确实可以被23整除。修改该程序,使其显示为错误?
#include <stdio.h>
int main(void)
{
double enterednumber;
printf("This is a test to see if a number is divisible by 23.\nPlease enter a number ");
scanf("%lg", &enterednumber);
switch ((int) enterednumber%23)
{
case 0:
printf("Yes, %g is divisible by 23\n", enterednumber);
break;
default:
printf("No, %g is not divisible by 23\n", enterednumber);
break;
}
return 0;
}
最佳答案
始终检查输入函数中的错误,并且在输入函数说没有给您值时不要使用“值”。
if (scanf("%lg", &enterednumber) != 1)
...an error occurred, or EOF: do not use value in enterednumber...
在执行整数算术时,使用
double
的代码是奇怪的。您应该始终使用int
类型,避免强制转换,并使用%d
作为输入和输出格式。那么,如何使它输入,如果有人输入显示“发生错误,请检查号码”的非数字?
#include <stdio.h>
int main(void)
{
int enterednumber;
int rc;
printf("This is a test to see if a number is divisible by 23.\nPlease enter a number ");
if ((rc = scanf("%d", &enterednumber)) != 1)
{
if (rc == EOF)
printf("EOF detected\n");
else
printf("Non-number detected\n");
return 1;
}
switch (enterednumber % 23)
{
case 0:
printf("Yes, %d is divisible by 23\n", enterednumber);
break;
default:
printf("No, %d is not divisible by 23\n", enterednumber);
break;
}
return 0;
}
如果您决定在代码周围环绕一个循环(以便用户可以输入多个数字),则需要在检测到无效输入后清除错误。可能最简单的方法是:
if ((rc = scanf("%d", &enterednumber)) != 1)
{
if (rc == EOF)
{
printf("EOF detected\n");
return 1;
}
else
{
int c;
printf("Non-number detected\n");
while ((c = getchar()) != EOF && c != '\n' && !isdigit(c))
;
continue; // I hypothesized a loop around this!
}
}
您可以决定在读取时是否打印非数字字符。另一种选择是读取整行(使用
fgets()
或POSIXgetline()
),然后在行上使用sscanf()
。这样可以更轻松地报告错误文本是什么。关于c - C开关“默认”无法按预期方式工作,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20303884/