【问题标题】:How do I determine whether an input value is not a number?如何确定输入值是否不是数字?
【发布时间】:2017-03-02 20:05:33
【问题描述】:

我想创建一个程序来判断一个数字是奇数还是偶数,但如果我输入一个字母,程序必须停止。我想做的是创建一个 if 语句,允许程序了解我输入的是数字还是其他内容。 这是代码。

#include <stdio.h>
#include <stdlib.h>
int main(void)
{
    int a,b;

    printf("type a number ");
    scanf("%d", &a);
    printf("\n");

    if (a<0) //This is supposed to understand if what I typed is a number, but it's not correct at all.
    {
        printf("ERROR, YOU MUST TYPE A NUMBER, NOT LETTERS.");
        system("PAUSE \n");
        return 0;
    }

    b=(a%2);

    if (b != 0)
    {
        printf("it's an odd number! ");
        printf("\n\n");
        system("PAUSE");
        return 0;
    }
    else
    {
        printf("it's an even number! ");
        printf("\n\n");
        system("PAUSE");
        return 0;
    }
}

【问题讨论】:

  • 检查scanf()的返回值,看看输入是否可以正确解释为数字。
  • 另一种可能性是使用fgets 将输入收集为字符串,然后查看是否可以使用strtol 系列函数成功地将其转换为数字......这是更多不过工作。
  • 所有变量都是位的集合,处理器将其解释为数字。在稍高的层次上,我们说某些数字是非数字数据的代码,例如英文字母,但仅限于上下文中。
  • 如果您要实际检查调用scanf() 的返回值,它会告诉代码输入是否为数字。如果输入不是数字,则 scanf() 将返回 0。如果输入是数字,则 scanf() 将返回 1。该返回值指示成功输入转换的次数。 (注意scanf() 也可以在发生某些问题或用户键入(取决于操作系统) 时返回 EOF

标签: c if-statement integer


【解决方案1】:

scanf() 返回匹配的格式说明符的数量,因此如果输入的文本不能解释为十进制整数,则返回零。

printf("type a number ");
int converted = scanf("%d", &a);
printf("\n");

if( converted == 0) 
{
    printf("ERROR, YOU MUST TYPE A NUMBER, NOT LETTERS.");
    system("PAUSE \n");
    return 0;
}

测试小于零将不起作用,因为例如 -1 是一个完全有效的十进制整数。如果您将a 初始化为-1,它可能看起来有效,但您无法输入负数。也就是说scanf() 不保证不修改失败不匹配的参数。

【讨论】:

  • 这不完全正确,因为如果你输入 25lsjd scanf 将返回 1 并且它不是一个有效值
  • 是的。我注意到了。但这是一个开始!
  • 所以只需测试整数后面的值是否为'\n'或不像这里stackoverflow.com/questions/4072190/…
  • @ZiedGUESMI :您是对的,但是数字后跟垃圾是否是可接受的输入是设计问题,而不是“不正确”。
【解决方案2】:

检查a&lt;0 在这种情况下是否不起作用,因为scanf() 要么在未找到整数时返回 0,要么返回找到的整数个数。另一种情况是,如果在发生任何转换之前达到输入,则返回 EOF。只需检查scanf() 是否成功读取一个整数:

if (scanf("%d", &a) != 1) {
    printf("Invalid number\n");
    exit(EXIT_FAILURE);
}

/* else, valid integer was found */

/* other code */

您也可以只使用fgets(3) 读取输入字符串,使用strtol(3) 进行更彻底的整数转换。这是一个例子:

char number[50];
char *endptr;
int num;
size_t slen;

if (fgets(number, 50, stdin) != NULL) {

    /* removes newline appended from fgets() */
    slen = strlen(input);
    if (slen > 0 && number[slen-1] == '\n') {
        number[slen-1] = '\0';
    }

    num = strtol(number, &endptr, 10);
    if (endptr == number) {
        /* No digits found */
    }

    if (*endptr != '\0') {
        /* more characters found after number */
    }

    /* more error checking at man page */
}

【讨论】:

  • 使用这段代码,程序什么也没有返回我只是空白。
【解决方案3】:

您可以使用格式读入字符缓冲区,例如 %40s(假设您的缓冲区是 40 个字符),然后使用 strtol() 查看标记是否是一个整数,最后没有多余的垃圾。

【讨论】:

    猜你喜欢
    • 2023-04-04
    • 2014-02-18
    • 1970-01-01
    • 1970-01-01
    • 2012-06-20
    • 1970-01-01
    • 2014-08-03
    • 2014-03-12
    • 1970-01-01
    相关资源
    最近更新 更多