我对从字符串到整数的转换有疑问。 我通过函数 fgets 得到了一个字符串,然后我使用 strtol 函数将它转换为 int。 这是代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <limits.h>
int main(void)
{
char buf[BUFSIZ];
char *p = NULL;
long int val;
int numero;
int temp;
do
{
temp=0;
printf ("Enter a number: ");
if (fgets(buf, sizeof(buf), stdin) != NULL)
{
val = strtol(buf, &p, 10);
if(buf==p)
{
printf(" no digits \n");
temp=1;
}
if ((errno == ERANGE && (val == LONG_MAX || val == LONG_MIN)) || (errno != 0 && val == 0))
{
perror("strtol");
temp=1;
}
if (*p != '\0')
{
printf("you have insert any char character \n");
temp=1;
}
}
else
{
printf("Error\n");
temp=1;
}
}
while(temp == 1);
/* If we got here, strtol() successfully parsed a number */
numero=(int)val;
printf("***** The number is : %d ******* \n",numero);
return 0;
}
这段代码不工作,但如果我替换这个控件,它就可以工作
if (*p != '\0')
{
printf("you have insert any char character \n");
temp=1;
}
用这个:
if (*p != '\n')
{
printf("you have insert any char character \n");
temp=1;
}
你知道为什么吗? :)
编辑: 这是我最终功能版本的代码 :) 感谢所有 :) 现在看来一切正常:
int readIN(int *numero)
{
long int val;
char buf[BUFSIZ];
char *p = NULL;
if (fgets(buf, sizeof(buf), stdin) != NULL)
{
val = strtol(buf, &p, 10);
if(buf==p)
{
return 1;
}
if ( (val > INT_MAX || val < 0) || (errno != 0 && val == 0))
{
return 1;
}
if (*p != '\n' && *p != '\r' && *p != '\0')
{
return 1;
}
}
else
{
return 1;
}
*numero=(int)val;
return 0;
}
最佳答案
您的代码完美运行。它已正确识别出数字后有尾随字符。正如 Matt 所说,gets
返回整行,包括结尾的换行符(另外:为什么人们坚持将实际答案作为评论发布?)。
鉴于您的字符串几乎总是有此换行符,您的简单修复可能是正确的做法。
不过有两个异常(exception):
- 文件结束
- 在行尾使用回车的操作系统。
一个更彻底的解决方案是这样的:
if (*p != '\n' && *p != '\r' && *p != '\0')
{
printf("error: unexpected trailing characters in input\n");
temp=1;
}
关于使用 strtol() :\0' or '\n'? 从字符串转换为 int,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24527944/