atoi忽略字符串中的一个字母进行转换

Mrs*_*sIl 3 c atoi

我正在使用atoi将字符串integer值转换为整数.但首先我想测试函数的不同情况,所以我使用了以下代码

#include  <stdio.h>

int main(void)
{
    char *a ="01e";
    char *b = "0e1";
    char *c= "e01";
    int e=0,f=0,g=0;        
    e=atoi(a);
    f=atoi(b);
    g=atoi(c);
    printf("e= %d  f= %d  g=%d  ",e,f,g);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

此代码返回e= 1 f= 0 g=0 我不知道为什么它返回1"01e"

Jea*_*bre 11

那是因为atoi解析整数是一个不安全和过时的函数.

  • 它会在遇到非数字时解析和停止,即使文本全局不是数字.
  • 如果第一个遇到的char不是空格或数字(或加号/减号),则它只返回0

祝你好运确定用户输入是否有效(至少scanf-type函数能够返回0或1,无论字符串是否都不能作为整数解析,即使它们与以整数开头的字符串具有相同的行为). ..

使用诸如strtol检查整个字符串是数字的函数更安全,并且甚至能够告诉您在使用适当的选项集进行解析时哪个字符无效.

用法示例:

  const char *string_as_number = "01e";
  char *temp;
  long value = strtol(string_as_number,&temp,10); // using base 10
  if (temp != string_as_number && *temp == '\0')
  {
     // okay, string is not empty (or not only spaces) & properly parsed till the end as an integer number: we can trust "value"
  }
  else
  {
     printf("Cannot parse string: junk chars found at %s\n",temp);
  }
Run Code Online (Sandbox Code Playgroud)

  • 它的工作原理如下:没有错误检查.我不会称之为"不安全",有一些用例,其中`atoi()`就是你所需要的. (2认同)
  • @FelixPalmen`ato`对于快速和脏的编程是可以的,因为界面很简单:字符串输入,编号输出,但不适用于"严重"程序.有点像`得到'.问题是:黑客经常成为真正的商业软件,没有任何修改:) (2认同)
  • @ Jean-FrançoisFabre不,`gets()`是无条件**禁令**的少数几个例子之一,因为使用它总是**一个bug.`atoi()`只是不适合用户输入,但是当你已经知道你的字符串中有什么内容时就完全没问题了. (2认同)