C-整数输入验证代码
我有以下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),
#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);