使用 strtol() :\0' or '\n'? 从字符串转换为 int

标签 c strtol

我对从字符串到整数的转换有疑问。 我通过函数 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):

  1. 文件结束
  2. 在行尾使用回车的操作系统。

一个更彻底的解决方案是这样的:

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/

相关文章:

c++ - 将堆上的结构从 C++ 转换为 C

c++ - 使用 2 种不同方法时的 O(N) 差异很大

GCC源代码中的C语法

c - 尝试链接静态 C 标准库时出错

c - 对 char 数组中存储的字节使用 strtol

C++ 程序在两台不同的机器上编译。共享库在一个上正常工作。另一方面,类方法返回 NULL

c++ - 在没有循环/条件的情况下将字符串检查为 int 错误

c - strtol 未按预期工作

c - strtol() 错误地返回 0

c - 为什么不能只检查 errno 是否等于 ERANGE?