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

atoi ignores a letter in the string to convert

我正在使用 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;
}

此代码returnse= 1 f= 0 g=0 我不明白为什么 returns 1 for "01e"

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

  • 它在遇到非数字时解析并停止,即使文本是全局的不是数字。
  • 如果第一个遇到的字符不是 space 或数字(或 plus/minus 符号),它只是 returns 0

祝你好运,确定用户输入是否对这些有效(至少 scanf 类型的函数能够 return 0 或 1 字符串是否根本不能解析为整数,即使它们与字符串 starting 和整数具有相同的行为)...

使用 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 == '[=10=]')
  {
     // 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);
  }

你错过了一个机会:写你自己的atoi。将其称为 Input2Integer 或 atoi 以外的名称。

int Input2Integer( Str )

请注意,您有一个指向字符串的指针,您需要确定何时开始、如何计算结果以及何时结束。

首先:将 return 值设置为零。

第二:当字符串不为 null '\0' 时对其进行循环。

第三种:return当输入的字符不是有效数字时。

第四:根据有效输入字符修改return值

然后回来解释为什么 atoi 会这样工作。你将学习。我们会微笑。