C 检查输入是否为数字,如果不是,则返回输入

C 检查输入是否为数字,如果不是,则返回输入,c,input,C,Input,所以,我对这个网站和编程都是新手。我在看我的第一本书,我爸爸给了我一个“家庭作业”,他不知道做什么的代码,但我想做。这就是我想做的: 我想创建一个类似计算器的程序,在其中输入一个值a和一个值B,然后程序显示a+B的结果。我已经这样做了,问题是如果我输入一个字符,程序会一直读取其他代码。这是我写的,也许你会更明白 #include <stdio.h> #include <conio.h> #include <ctype.h> void main(void)

所以,我对这个网站和编程都是新手。我在看我的第一本书,我爸爸给了我一个“家庭作业”,他不知道做什么的代码,但我想做。这就是我想做的: 我想创建一个类似计算器的程序,在其中输入一个值a和一个值B,然后程序显示a+B的结果。我已经这样做了,问题是如果我输入一个字符,程序会一直读取其他代码。这是我写的,也许你会更明白

#include <stdio.h>
#include <conio.h>
#include <ctype.h>
void main(void)
  {
   int val_a;
   int val_b;
   int result;

   printf("Write a number A=");
   scanf("%d", &val_a);
   if(isdigit(val_a))
   {
    printf("\nWrite a number B=");
    scanf("%d", &val_b);
   }
else
  printf("\nI said number.\n");
result = val_a + val_b;
printf("%d + %d = %d", val_a, val_b, result);
getch();
printf("\033[2J");   \\ to clear the screen
}
#包括
#包括
#包括
真空总管(真空)
{
国际瓦卢阿;
国际瓦卢b;
int结果;
printf(“写一个数字a=”);
scanf(“%d”和“val_a”);
if(isdigit(val_a))
{
printf(“\n写入数字B=”);
scanf(“%d”和“val_b”);
}
其他的
printf(“\n所述数字。\n”);
结果=val_a+val_b;
printf(“%d+%d=%d”,值a,值b,结果);
getch();
printf(“\033[2J”);\ \清除屏幕
}
所以我想要的是程序会回到我必须输入数字A的地方。 我在谷歌上找到了关于标签的信息,但我什么都不懂:D。也许有人可以发布一个我想要的例子,这样我就可以研究它了

我应该写我的名字吗?也许下次:p


PS:我希望有人能在我写的东西中发现一个NOOB错误并告诉我。祈祷:

你的
isdigit
函数全错了。它是用来接收一个char参数的,但是在你的情况下int被转换了,你可能会说降级了

该函数基于ASCII字母代码。您可以尝试自己查看

char c = '1';
if(isdigit(c))
   printf("digit");

此外,您需要的是
do{/*something*/}while(布尔值);

您误解了isdigit函数的使用。它确定字符是否为数字,如“0”、“1”、“2”等。但是,您已经使用scanf函数将输入转换为整数。因此,只需删除对isdigit的调用,而改为检查scanf的返回码,它将告诉您用户输入的字符是否有效编号。

您需要检查
scanf()
是否成功读取了它应该读取的输入。通常,您应该在读取后检查读取是否成功。
scanf()
返回成功读取输入的数量,这些输入基本上对应于它可以成功读取的格式说明符的数量。例如,您应该检查

if (scanf("%d, &val_a) == 1)) {
    ...
}
读取的值可能是或不是“数字”。通常,根据
isdigit()
,它可能不是数字,因为此函数仅对字符
'0'
'1'
,…,
'9'
的整数值返回true。测试
scanf()
无法读取其所有格式说明符,应避免此问题

如果
scanf()
失败,您可以读取一个字符(使用例如
fgetc()
)然后重试,或者读取整行(不是使用
gets()
而是使用
fgets()
)。您可能还需要打印一条消息,说明输入的内容与预期不符。

评论 您应该从
scanf()
测试返回值,以查看它是否能够读取数字

    if (isdigit(val_a))
此测试“有效”,但它检查输入的数字是否在48到57范围内(这是数字
'0'
'9'
的ASCII、CP1252、Unicode、ISO 8859-1等代码)。这可能不是您所想的

    {
        printf("\nWrite a number B=");
        scanf("%d", &val_b);
用户输入了一个换行符,因此
printf()
格式字符串前面的换行符是不必要的,尽管它也是无害的。关于检查
scanf()
的相同注释也适用于此处

    }
    else
        printf("\nI said number.\n");
进行错误检查是很好的。但是,即使检测到错误,也要继续进行。您确实需要停止

    result = val_a + val_b;
    printf("%d + %d = %d", val_a, val_b, result);
总的来说,最好用换行符结束行。它将数据刷新到文件或屏幕上

    getch();
    printf("\033[2J");   \\ to clear the screen
printf()
格式字符串不可移植。考虑到您包含了
,您可能应该使用
clrsc()
(这可能会将转义序列或等效序列发送到终端).我不认为有必要在程序结束时清除屏幕,但我主要在Unix系统上工作,而不是在Windows上

}
鉴于MSVC仍然是C89编译器,您应该在程序末尾包含
return0;
,以返回成功状态

重写 添加所有更改后,您将得到:

#include <stdio.h>
#include <conio.h>

int main(void)
{
    int val_a;
    int val_b;
    int result;

    printf("Write a number A=");
    if (scanf("%d", &val_a) != 1)
    {
        printf("I said number.\n");
        getch();
        clrscr();
        return(1);
    }
    printf("\nWrite a number B=");
    if (scanf("%d", &val_b) != 1)
    {
        printf("I said number.\n");
        getch();
        clrscr();
        return(1);
    }

    result = val_a + val_b;
    printf("%d + %d = %d\n", val_a, val_b, result);
    getch();
    clrscr();
    return(0);
}
main()
中的代码假设您可以任意混合语句(如
atexit()
)和声明(如
int val\u a
),这是标准C当前(2011)和旧(1999)版本所允许的,但原始(1989)版本不允许标准C的版本。我相信MSVC遵循原始标准。如果是这样,您可能需要将
main()
写成:

int main(void)
{
    atexit(wait_at_exit);
    {
    int val_a  = get_a_number("Write a number A=");
    int val_b  = get_a_number("Write a number B=");
    int result = val_a + val_b;
    printf("%d + %d = %d\n", val_a, val_b, result);
    }
    return(0);
}
是否应该将内部块(内部大括号)中的代码缩进一个额外的级别是一个很好的讨论点。您总是可以在大括号中包含的代码块的开头声明变量,这样我就可以编写对
atexit()
的调用,然后定义和使用这些变量

如果你读过关于敏捷编程的文章,你会发现其中一条箴言是:

  • 干燥-不要重复你自己
上面为避免重复的
getscr()
调用而进行的重写可以被视为该咒语的应用。与
get\u a\u number()
函数类似,它应用于干式咒语


再试一次 如果您想让程序返回并在用户键入错误时再次提示,则需要修改
get_a_number()
函数。而且,由于函数变得更加复杂,您肯定需要使用函数来完成作业。您还遇到了
scanf()的问题
;它不允许您强制执行
}
#include <stdio.h>
#include <conio.h>

int main(void)
{
    int val_a;
    int val_b;
    int result;

    printf("Write a number A=");
    if (scanf("%d", &val_a) != 1)
    {
        printf("I said number.\n");
        getch();
        clrscr();
        return(1);
    }
    printf("\nWrite a number B=");
    if (scanf("%d", &val_b) != 1)
    {
        printf("I said number.\n");
        getch();
        clrscr();
        return(1);
    }

    result = val_a + val_b;
    printf("%d + %d = %d\n", val_a, val_b, result);
    getch();
    clrscr();
    return(0);
}
#include <stdio.h>
#include <conio.h>

static int get_a_number(const char *prompt)
{
    int value;
    printf(prompt);
    if (scanf("%d", &value) != 1)
    {
        printf("I said number.\n");
        getch();
        clrscr();
        exit(1);
    }
    return value;
}

int main(void)
{
    int val_a  = get_a_number("Write a number A=");
    int val_b  = get_a_number("Write a number B=");
    int result = val_a + val_b;
    printf("%d + %d = %d\n", val_a, val_b, result);
    getch();
    clrscr();
    return(0);
}
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>

static void wait_at_exit(void)
{
    getch();
    clrscr();
}

static int get_a_number(const char *prompt)
{
    int value;
    printf(prompt);
    if (scanf("%d", &value) != 1)
    {
        printf("I said number.\n");
        exit(1);
    }
    return value;
}

int main(void)
{
    atexit(wait_at_exit);
    int val_a  = get_a_number("Write a number A=");
    int val_b  = get_a_number("Write a number B=");
    int result = val_a + val_b;
    printf("%d + %d = %d\n", val_a, val_b, result);
    return(0);
}
int main(void)
{
    atexit(wait_at_exit);
    {
    int val_a  = get_a_number("Write a number A=");
    int val_b  = get_a_number("Write a number B=");
    int result = val_a + val_b;
    printf("%d + %d = %d\n", val_a, val_b, result);
    }
    return(0);
}
enum { MAX_LINELENGTH = 4096 };
enum { MAX_ATTEMPTS   = 10   };

static int get_a_number(const char *prompt)
{
    int value;
    char line[MAX_LINELENGTH];
    int count = 0;
    while (fputs(prompt, stdout) != EOF &&
           fgets(line, sizeof(line), stdin) != 0)
    {
        if (sscanf(line, "%d", &value) == 1)
            return value;
        if (count++ > MAX_ATTEMPTS)
        {
            printf("I give in; I don't understand what you're typing\n");
            exit(1);
        }
        printf("I said please enter a number.\n");
    }

    printf("Oops: I got EOF or an error; goodbye!\n");
    exit(1);
}
        printf("I didn't understand what you meant when you typed:\n%s\n"
               "I said please enter a number.\n", line);