C - 整数输入验证代码

标签 c validation input integer

我在 C 中有以下代码:

#include "stdafx.h"
#include <stdlib.h>
#include <cstring>
#include <ctype.h>

int main()
{
    char buffer[20];
    int num;
    bool valid = true;

    printf("Please enter a number\n");
    fgets(buffer, sizeof(buffer), stdin);
    printf("\n\n");

    if(!isdigit(buffer[0])) //Checking if the first character is -
    {
        if(buffer[0] != '-')
        {
            valid = false;
        }

        else
        {
            if(!isdigit(buffer[1]))
            {
                valid = false;
            }
        }
    }

    char *pend = strrchr(buffer, '\n'); //Replacing the newline character with '\0'

    if (pend != NULL)
    {
        *pend = '\0';
    }

    for (int i = 1; i < strlen(buffer); i++) //Checking that each character of the string is numeric
    {
        if (!isdigit(buffer[i]))
        {
            valid = false;
            break;
        }
    }

    if(valid == false)
    {
        printf("Invalid input!");
    }

    else
    {
        num = atoi(buffer);
        printf("The number entered is %d", num);
    }
    getchar();
}

基本上,代码确保用户输入是正整数或负整数。不允许使用字母、 float 等。

代码运行完美并且很好地完成了它的工作。

但是,代码太长,我必须在多个程序中实现它。有没有一种简单的方法可以在 C 中执行上述所有操作?也许有一个更短的替代方案可以确保输入:

i) 不是一个字母 ii) 正数或负数

最佳答案

bool valid = false;
char *c = buffer;
if(*c == '-'){
   ++c;
}
do {
   valid = true;
   if(!isdigit(*c)){
      valid = false;
      break;
   }
   ++c;
} while(*c != '\0' && *c != '\n');

注意:这不会处理十六进制值,但会传递八进制(从 0 开始的整数)

我还必须同意,这应该放在一个公共(public)库中并作为函数调用。

关于C - 整数输入验证代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15233268/

相关文章:

无法重新分配结构数组的内存(下一个大小无效)

c# - WPF ValidatesOnDataErrors=False 不工作

java - 如何从验证工厂的验证函数中获取变量或变量名称

java - 多个 Java 输入

linux - 通过 linux 脚本将输出写入文件?

html - 如何更改type = time的html输入标签随附的小时钟图标的颜色

objective-c - 使用 Objective-C/C 从网络驱动器复制目录

c - 当您使用稍后分配给全局的临时值时,GCC 不会将内联汇编 "=g"输出优化为内存操作数?

java - 一般 JNA 问题(Discord Game SDK (C) -> Java)

javascript - 触发 JQuery 事件后不会触发代码隐藏 OnClick 事件