Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/57.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 仅使用FGET检查整数而不检查字符串_C_Fgets_Stdio_Atoi - Fatal编程技术网

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()
告诉