我对从string转换为int有疑问。 我通过函数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;
}
答案 0 :(得分:3)
您的代码完美无缺。它已正确识别数字后面有尾随字符。正如Matt所说,gets
返回整行,包括尾随换行符(除此之外:为什么人们坚持将实际答案作为评论发布?)。
鉴于你的字符串几乎总是有这个换行符,你的简单修复可能是正确的。
但有两个例外:
更彻底的解决方案是:
if (*p != '\n' && *p != '\r' && *p != '\0')
{
printf("error: unexpected trailing characters in input\n");
temp=1;
}