当前位置: 首页 > 知识库问答 >
问题:

数字验证-无止境循环

呼延渝
2023-03-14

我有此代码来验证用户输入。条件:输入的值只能是零或正数。不接受负值和字母字符。

这是我的代码,它一直在循环:

#include <stdio.h>

int main ()
{
   int a, b, c, d;

   printf ("enter value for a:");
   do {
      b = 0;
      scanf ("%d", &a);
      if (!isdigit(a)) {
         printf("Number must be numeric!:\n");
         b++;
      }
      else if (a < 0) {
         printf ("number must be postive\n");
         b++;
      } else {
         printf("\neverything is goood\n");
      }
   } while (b != 0);
}

共有3个答案

丘飞
2023-03-14

以下是我可以发现的代码的一些问题:

  1. 将scanf与已经将输入解析为整数值的格式说明符一起使用。因此,无需使用isdigit检查它是否为数字。事实上,isdigit正在检查十进制数字字符,因此您的用法不正确
  2. 您从不检查scanf是否返回。你应该这样做。如果出现错误(即值不是数字),则不会从流中删除输入。换言之,您将无法反复解析相同的错误值
  3. 您有未使用的变量,但忘记包含某些头文件。但在你的情况下,这些都是小事(但在某些情况下可能是大事!)

也就是说,下面是一些可能适合您的代码:

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

static void skip_input(FILE *stream)
{
    int c;
    do {
        c = fgetc (stream);
    } while (c != EOF && c != '\n');
}

int main()
{
    int a;
    int r;

    printf("Please enter a value: ");

    for (;;) {
        r = scanf("%d", &a);
        if (r == EOF)
            return EXIT_FAILURE;
        if (r != 1) {
            printf("Number must be numeric!\n");
            skip_input(stdin);
        } else if (a < 0) {
            printf("Number must be postive\n");
            skip_input(stdin);
        } else {
            printf("Everything is goood\n");
            break;
        }
    }

    return EXIT_SUCCESS;
}

希望有帮助。

殳阳飙
2023-03-14

一旦用户出错,b总是

丌官和泰
2023-03-14

isdigit()期望一个ASCII编码的字符,但是scanf带有%d参数正在将ASCII编码的数字(字符串)转换为实际数字。

也就是说,如果输入ASCII码为0x31的“1”,则scanf(“%d”)将把它转换为值。ASCII码为1不是数字。

要解决此问题,请执行以下操作之一:

  • a键入char并使用scanf格式说明符%c,然后isdigit()将执行您想要的操作

此外,您应该打开编译器警告并包含包含isdigit()函数的头文件,ctype. h

 类似资料:
  • 此特定环境下的程序:EJB3.0 JPA jersey Web Service 第一个实体: 第二实体: 当我拿到班级考试的学生名单时。例外情况是: 如果我更改fetch FetchType。懒惰例外情况是: 如何解决我的问题?

  • 这似乎是一个永无止境的故事,但我无法从Twitter4J流API访问Twitter。 > 我创建了一个Twitter帐户,并将时区更改为我的祖国 我在Twitter上创建了一个App 我创建了一个ClientApp在Java /Maven与Twitter4J流API 4.0.0 我在配置生成器中放置了Api-Key、秘密密钥和访问令牌 我从推特上得到一个例外 401:身份验证凭据(https://

  • 如果给定值是一个数字,则返回 true ,否则返回false 。 使用 !isNaN() 和 parseFloat() 来检查参数是否是一个数字。使用 isFinite() 来检查数字是否是有限数。使用 Number() 来检查强制转换是否成立。 const validateNumber = n => !isNaN(parseFloat(n)) && isFinite(n) && Number(n

  • 我正在制作一个基于文本的冒险游戏,我需要进行一些用户输入验证 我已经为这个特定实例设置了循环,但在输入正确的输入后,我似乎无法使循环中断。 代码: 我的输出是这样的: 你的选择是敲打还是猛击。别那么粗鲁。 大满贯 你猛地撞上沉重的橡木门,沉重的铁铰链砰的一声让位了。当你凝视城堡的第一个房间时,灰尘落在你的头上。大厅大约有五十英尺长。西墙有三扇门,东墙有两扇门。空气中弥漫着霉菌、湿气和铁的味道。曾经

  • 我试图验证一个逗号分隔的数字列表1-384唯一(不重复)。 即。 1, 2, 3, 5, 6, 7, 9有效 1-3, 5-7, 9有效 2,2,6无效 2,无效 1, 2, 3, 4, 15, 6, 7, 385无效,因为最后一个数字大于384 我尝试了以下RegEx模式,但还不够:

  • 我有字节数组格式的公钥。在我的数据库里。像这样 在此处输入图像描述 总是suc=false。我确信bytetoverify的值与方法符号中的输入值相同。 我不知道我用这种方式生成公钥是问题还是符号有问题。在符号方法中,我使用sh1和pkcs1,但在验证中,我只找到sh1。 每个人都能帮我吗?