如何在多个表C程序中检查输入整数?

时间:2018-04-15 16:20:38

标签: c scanf

输入整数时,我有关于打印多个表的C程序。我还想检查整数,如果我输入了错误的类型,请注意错误,例如" 1a"将显示"错误的输入! "或" -5"将显示"输入的数字必须大于0"。请帮助我一些人。感谢阅读!这是我的代码:

#include <stdio.h>
#include <stdlib.h>

int main (int argc, char **argv)
{
    int n;
    printf ("Enter an integer: ");
    scanf ("%d", &n);
    check_input (n);
    multible (n);
}

int clean_stdin ()
{
    while (getchar () != 'n') {
    }
    return 1;
}

void check_input (int n)
{
    char c;
    do {
        printf ("Enter an integer: ");
    } while (((scanf ("%d%c", &n, &c) != 2 || c != 'n') && clean_stdin ()));

    printf ("done, number is %d", n);
    return 0;
}

int multible (int n)
{
    for (int i = 1; i <= 10; ++i) {
        printf ("%d * %d = %d \n", n, i, n * i);
    }
    return 0;
}

2 个答案:

答案 0 :(得分:1)

你的代码是混乱的,温和地说。您检查c != 'n',检查c != '\n''n'是ASCII字符110'\n'换行符字符(ASCII 10)。

接下来,clean_stdin的返回类型应为void - 您什么都不返回,check_input的返回类型应该是允许您指示成功/失败的校验。您不使用argcargv,因此main()的声明应为int main (void)。您不能使用stdlib.h中声明的任何函数,因此不需要包含该标头。 main()中没有显示任何功能,因为它们是在main()之后声明的,并且没有指定函数原型上面main()

让我们看看你如何做你想做的事情。首先,让我们清理clean_stdin,这样就可以完成预期的工作,例如。

void clean_stdin ()
{
    int c = getchar();

    while (c != '\n' && c != EOF)
        c = getchar();
}

接下来,如果您使用scanf(或任何一系列功能),则必须检查返回,并通过生成手册{{来处理用户取消输入的情况1}},您必须解决匹配输入失败的情况(例如,返回小于指定的转换次数),最后,您确定并处理良好的输入案例,使用EOF来删除clean_stdin中保留的所有字符,这样他们就不会在下次通话时咬你。

由于您的目的是获取整数输入,因此无需获取它,然后在单独的函数中检查它,只需创建一个填充整数值的函数(其地址作为参数传递)并返回stdin表示失败1表示成功,例如

0

您的int get_int_input (int *n) { *n = 0; for (;;) { int rtn, tmp; printf ("Enter an integer: "); rtn = scanf ("%d", &tmp); if (rtn == EOF) { /* handle user canceled input */ fputs ("(user canceled input).\n", stderr); return 1; } if (rtn == 1) { /* good input, set *n = tmp, clean, return */ *n = tmp; clean_stdin(); return 0; } /* handle matching or input failure */ fputs ("error: invalid input.\n", stderr); clean_stdin(); } } 功能将按原样运行,但您的循环限制与通常看到的限制相反,例如: multible,在那里进行调整:

i = 0; i < 10

然后剩下的就是获得所需的输入并调用int multible (int n) { for (int i = 0; i < 10; ++i) { printf ("%d * %d = %d \n", n, i + 1, n * (i + 1)); } return 0; } ,例如

multible

接下来,始终使用警告启用进行编译,接受代码,直到干净地编译而不发出警告。要启用警告,请将int main (void) { int n; if (get_int_input (&n)) return 1; multible (n); return 0; } 添加到-Wall -Wextragcc编译字符串中。 (添加clang以获得其他几个警告)。对于-pedantic,您可以使用clang。对于 VS (windoze上的-Weverything),请添加cl.exe(或/Wall以限制一些无关的警告)。阅读并理解每个警告。他们将识别任何问题,以及它们发生的确切线。您可以通过简单地聆听编译器告诉您的内容,从大多数教程中学到很多关于编码的知识。

完全放弃,您可以执行以下操作:

/W3

在启用警告的情况下进行编译

#include <stdio.h>

void clean_stdin ()
{
    int c = getchar();

    while (c != '\n' && c != EOF)
        c = getchar();
}

int get_int_input (int *n)
{
    *n = 0;

    for (;;) {
        int rtn, tmp;

        printf ("Enter an integer: ");

        rtn = scanf ("%d", &tmp);

        if (rtn == EOF) {   /* handle user canceled input */
            fputs ("(user canceled input).\n", stderr);
            return 1;
        }
        if (rtn == 1) {     /* good input, set *n = tmp, clean, return */
            *n = tmp;
            clean_stdin();
            return 0;
        }
        /* handle matching or input failure */
        fputs ("error: invalid input.\n", stderr);
        clean_stdin();
    }
}

int multible (int n)
{
    for (int i = 0; i < 10; ++i) {
        printf ("%d * %d = %d \n", n, i + 1, n * (i + 1));
    }
    return 0;
}

int main (void)
{
    int n;

    if (get_int_input (&n))
        return 1;

    multible (n);

    return 0;
}

示例使用/输出

考虑输入错误和用户取消的情况:

$ gcc -Wall -Wextra -pedantic -std=gnu11 -Ofast -o bin/getintinput getintinput.c

有效的输入案例:

$ ./bin/getintinput
Enter an integer: foo
error: invalid input.
Enter an integer: foo
error: invalid input.
Enter an integer: (user canceled input).

仔细看看,如果您有其他问题,请告诉我。

答案 1 :(得分:0)

看一下strtol函数。请考虑如何处理错误。使用它,您可以轻松创建整数测试函数