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

时间:2017-09-07 07:43:18

标签: 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;
}

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

返回"01e"的原因

2 个答案:

答案 0 :(得分:11)

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

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

祝你好运确定用户输入是否对那些有效(至少scanf - 类型函数能够返回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);
  }

答案 1 :(得分:1)

你错过了一次机会:写下自己的atoi。称之为Input2Integer或除了atoi之外的其他东西。

int Input2Integer( Str )

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

首先:将返回值设置为零。

第二:循环遍历字符串,而不是'0'。

第三:当输入字符不是有效数字时返回。

第四:根据有效的输入字符修改返回值。

然后回过头来解释为什么atoi按照它的方式工作。你将学习。我们会微笑。