我仍在学习编程,所以很抱歉如果有一个简单的问题。我这里有一个确定数字是否可以被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()或POSIX
getline()),然后在行上使用sscanf()。这样可以更轻松地报告错误文本是什么。

关于c - C开关“默认”无法按预期方式工作,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20303884/

10-11 23:56