我使用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"
的原因
答案 0 :(得分:11)
那是因为atoi
是解析整数的不安全和过时的函数。
祝你好运确定用户输入是否对那些有效(至少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按照它的方式工作。你将学习。我们会微笑。