C开关“默认”无法以所需方式工作

时间:2013-11-30 18:16:56

标签: c switch-statement case default

我还在学习编程,很抱歉,如果有一个简单的问题。我在这里有一个程序来确定一个数字是否可以被23整除。但是,如果有人输入一个字符(这可能发生在意外),例如“你”,它错误地表明它确实可被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;
}

4 个答案:

答案 0 :(得分:4)

始终检查输入函数中的错误,并且当输入函数表明它没有给你一个值时,不要使用'value'。

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!
        }
    }

如果您决定围绕代码循环(以便用户可以输入多个数字),那么您需要在检测到无效输入后清除错误。这可能是最简单的完成:

sscanf()

您可以决定是否在阅读时打印非数字字符。另一种方法是读取整行(使用fgets()或POSIX getline()),然后在该行上使用{{1}}。这样可以更轻松地报告错误文本的内容。

答案 1 :(得分:0)

我认为问题在于您的角色是根据其ascii值在您的交换机中使用的。检查此链接:http://jackstromberg.com/2013/02/how-to-validate-numeric-integer-input-in-c/,看看在执行切换之前是否可以强制输入数字。

答案 2 :(得分:0)

当遇到无法转换的内容时,您期望scanf()做什么?

查看scanf() 的参考页面为您提供了所需的答案。

答案 3 :(得分:0)

只需从%g更改为%d,使用int代替double即可按预期运作:

int main(void)
{
    int enterednumber;

    printf("This is a test to see if a number is divisible by 23.\nPlease enter a number ");
    scanf("%d", &enterednumber);

    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;
}