Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C-整数输入验证代码_C_Validation_Input_Integer - Fatal编程技术网

C-整数输入验证代码

C-整数输入验证代码,c,validation,input,integer,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),

我有以下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();
}
#包括“stdafx.h”
#包括
#包括
#包括
int main()
{
字符缓冲区[20];
int-num;
bool valid=true;
printf(“请输入一个数字”);
fgets(缓冲区、sizeof(缓冲区)、stdin);
printf(“\n\n”);
if(!isdigit(缓冲区[0])//检查第一个字符是否为-
{
如果(缓冲区[0]!='-')
{
有效=错误;
}
其他的
{
if(!isdigit(缓冲区[1]))
{
有效=错误;
}
}
}
char*pend=strrchr(缓冲区“\n”);//将换行符替换为“\0”
if(pend!=NULL)
{
*pend='\0';
}
for(int i=1;i
基本上,代码确保用户输入是正整数或负整数。不允许使用字母、浮点数等

代码工作得很好,工作也很好

但是,代码太长,我必须在许多程序中实现它。有没有一种简单的方法可以在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开始的整数)


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

尽管有人指出strtol可能不会提供您需要的错误,但这是一种非常常见的操作类型,因此它确实存在于标准库中:

#包括
// ....
valid=sscanf(缓冲区、%d、&num);

另一个意见是,您不应该害怕编写复杂而有用的代码,并将其模块化。为您觉得有用的输入解析例程创建一个库

将其全部放在一个可重用的函数中。将该文件包括在各种项目中。你也可以缩减代码,但我太懒了,不想全部阅读,因为显而易见的解决方案是让你拥有的东西可重用。使用标准库
strtol
完成了所有这些操作。@n.m.
strtol()
没有正确返回错误。@AlexeyFrunze:
strtol
返回您需要的一切,只需正确使用它。@n.m.啊,我错过了关于当数字太大/太小时将
errno
设置为
ERANGE
的部分。但是,我不确定它是否将
errno
设置为某个值,当输入不是有效数字时,您不能使用返回值0来区分0和错误。您从未将
valid
设置为
true
。此外,
bool
true
false
应来自标题或定义。更改为initialize为true。是的,您应该包括stdbool.h来声明bool、true和false。@Alexey Frunze如果您觉得有必要,可以编写完整的回归套件。代码检查“-”以查看用户是否输入了负数。Exey关心的是字符串“-”(后面没有数字-将被检测为数字。我已更新代码以避免出现这种情况。
#include <stdio.h>

// ....

valid = sscanf (buffer,"%d",&num);