C 仅使用FGET检查整数而不检查字符串
我试图从命令行中获取一个整数,而不使用C 仅使用FGET检查整数而不检查字符串,c,fgets,stdio,atoi,C,Fgets,Stdio,Atoi,我试图从命令行中获取一个整数,而不使用scanf(),但仅使用fgets(),如果插入字符或字符串,如何过滤报告错误的fgets()内容?问题是,当我插入不同的字符或字符串时,atoi()函数(在我的算法中执行某些操作所必需的)会将该字符串转换为0,而如果插入的值与整数不同,我宁愿退出。 以下是代码部分: ..... char pos[30]; printf("\n Insert a number: "); fgets (pos, sizeof(pos), stdin); if (atoi(po
scanf()
,但仅使用fgets()
,如果插入字符或字符串,如何过滤报告错误的fgets()内容?问题是,当我插入不同的字符或字符串时,atoi()
函数(在我的算法中执行某些操作所必需的)会将该字符串转换为0,而如果插入的值与整数不同,我宁愿退出。
以下是代码部分:
.....
char pos[30];
printf("\n Insert a number: ");
fgets (pos, sizeof(pos), stdin);
if (atoi(pos) < 0) //missing check for string character
exit(1);
else{
printf ("%d\n", atoi(pos)); //a string or character converted through atoi() gives 0
}
int number = atoi(pos);
......
。。。。。
charpos[30];
printf(“\n插入一个数字:”);
fgets(pos、sizeof(pos)、stdin);
if(atoi(pos)<0)//缺少对字符串的检查
出口(1);
否则{
printf(“%d\n”,atoi(pos));//通过atoi()转换的字符串或字符给出0
}
整数=atoi(pos);
......
首先,您必须记住字符本质上不是字母字符;准确点
我想你要找的是一个“is integer”函数。
在标准C库ctype.h
中有名为isalpha
和isdigit
的函数
因此,您可以创建一个函数来验证char*
是否只包含数字字符
int str_is_only_numeric(const char *str) {
int i = 0;
while (str[i] != '\0') {
if (isdigit(str[i++]) == 0) {
return -1;
}
}
return 0;
}
下面是函数的一个工作示例:首先,您必须记住字符本质上不是字母字符;准确点
我想你要找的是一个“is integer”函数。
在标准C库ctype.h
中有名为isalpha
和isdigit
的函数
因此,您可以创建一个函数来验证char*
是否只包含数字字符
int str_is_only_numeric(const char *str) {
int i = 0;
while (str[i] != '\0') {
if (isdigit(str[i++]) == 0) {
return -1;
}
}
return 0;
}
下面是该函数的一个工作示例:正如评论员所说,使用strtol()
而不是atoi()
strtol()
的问题在于,只有当转换后的数字不能放入长类型时,才会出现erage
错误(根据规范)。因此,如果您要求它转换“1”
,它会给出1
。如果您要求它转换“apple”
,它将返回0
,并设置endptr
,以指示错误
显然,您需要确定“12”
是否是可接受的输入-strtol()
将愉快地跳过前导空格
编辑:通过endptr
更新功能以更好地处理错误
// Convert the given <text> string to a decimal long, in <value>
// Allow a string of digits, or white space then digits
// returns 1 for OK, or 0 otherwise
int parseLong( const char *text, long *value )
{
int rc = 0; // fail
char *endptr; // used to determine failure
if ( text && value )
{
errno = 0; // Clear any errors
*value = strtol( text, &endptr, 10 ); // Do the conversion
// Check that conversion was performed, and
// that the value fits in a long
if ( endptr != text && errno != ERANGE )
{
rc = 1; // success
}
}
return rc;
}
//将给定字符串转换为十进制长度,单位为
//允许一个数字串,或空白,然后是数字
//返回1表示正常,否则返回0
int parseLong(常量字符*文本,长*值)
{
int rc=0;//失败
char*endptr;//用于确定故障
如果(文本和值)
{
errno=0;//清除所有错误
*value=strtol(text,&endptr,10);//进行转换
//检查是否执行了转换,以及
//该值适用于长期
if(endptr!=text&&errno!=ERANGE)
{
rc=1;//成功
}
}
返回rc;
}
正如评论者所说,使用strtol()
而不是atoi()
strtol()
的问题在于,只有当转换后的数字不能放入长类型时,才会出现erage
错误(根据规范)。因此,如果您要求它转换“1”
,它会给出1
。如果您要求它转换“apple”
,它将返回0
,并设置endptr
,以指示错误
显然,您需要确定“12”
是否是可接受的输入-strtol()
将愉快地跳过前导空格
编辑:通过endptr
更新功能以更好地处理错误
// Convert the given <text> string to a decimal long, in <value>
// Allow a string of digits, or white space then digits
// returns 1 for OK, or 0 otherwise
int parseLong( const char *text, long *value )
{
int rc = 0; // fail
char *endptr; // used to determine failure
if ( text && value )
{
errno = 0; // Clear any errors
*value = strtol( text, &endptr, 10 ); // Do the conversion
// Check that conversion was performed, and
// that the value fits in a long
if ( endptr != text && errno != ERANGE )
{
rc = 1; // success
}
}
return rc;
}
//将给定字符串转换为十进制长度,单位为
//允许一个数字串,或空白,然后是数字
//返回1表示正常,否则返回0
int parseLong(常量字符*文本,长*值)
{
int rc=0;//失败
char*endptr;//用于确定故障
如果(文本和值)
{
errno=0;//清除所有错误
*value=strtol(text,&endptr,10);//进行转换
//检查是否执行了转换,以及
//该值适用于长期
if(endptr!=text&&errno!=ERANGE)
{
rc=1;//成功
}
}
返回rc;
}
在检查isdigit()
整数类型之前,如果没有strcspn(),它将始终返回-1在检查isdigit()
整数类型之前,我使用strcspn()自己解决由于错误检查,它将始终返回-1,最好使用类似的方法。不要使用atoi
。使用sscanf
检查返回值,或使用strtol
和。由于错误检查,最好使用类似的方法。不要使用atoi
。使用sscanf
并检查返回值,或者使用strtol
和。这忽略了+、-
和前导/尾随空格的可能性。但是如果我在缓冲区中插入一个数字,它将返回-1:int check_int(char s[],int n){int I=0;而(s[I]!='\0'){if(isdigit(s[I++])==0)返回-1;}return 0;}这忽略了+,-
和前导/尾随空格的可能性。但是如果我在缓冲区中插入一个数字,它就不起作用了,它仍然返回-1:int check_int(char s[],int n){int I=0;而(s[I]!='\0'){if(isdigit(s[I++])==0)返回-1;}返回0;}如果键入Apple
且不允许十六进制,则为错误。和strtol()
告诉