奇怪的atoi(char *)问题

时间:2013-04-12 01:28:24

标签: ios c atoi

atoi(char *)我遇到了一个非常奇怪的问题。我正在尝试将char转换为它的数字表示(我知道它是一个数字),它在98.04%的时间内完美地工作,但它会给我一个随机值,另外1.96%的时间。

以下是我用来测试它的代码:

int increment = 0, repetitions = 10000000;
for(int i = 0; i < repetitions; i++)
{
    char randomNumber = (char)rand()%10 + 48;
    int firstAtoi = atoi(&randomNumber);
    int secondAtoi = atoi(&randomNumber);
    if(firstAtoi != secondAtoi)NSLog(@"First: %d - Second: %d", firstAtoi, secondAtoi);
    if(firstAtoi > 9 || firstAtoi < 0)
    {
        increment++;
        NSLog(@"First Atoi: %d", firstAtoi);
    }
}
NSLog(@"Ratio Percentage: %.2f", 100.0f * (float)increment/(float)repetitions);

我在XCode 4.6.1中使用GNU99 C语言方言。第一个if(当第一个数字不等于第二个时)从不记录,所以两个atoi每次返回相同的结果,但是,每次结果都不同。 “不正确的结果”似乎从-1000到10000.我没有看到任何超过9999或任何低于-999。

请让我知道我做错了什么。


编辑:

我现在已将角色设计更改为:

char numberChar = (char)rand()%10 + 48;
char randomNumber[2];
randomNumber[0] = numberChar;
randomNumber[1] = 0;

但是,我正在使用:

MAX(MIN((int)(myCharacter - '0'), 9), 0)

获取整数值。

我非常感谢所有答案!

2 个答案:

答案 0 :(得分:6)

atoi需要一个字符串。你没有给它一个字符串,你给它一个char。字符串定义为空字符结尾的某些字符数。你正在调用UB。

来自文档:

  

如果str没有指向有效的C字符串,或者转换后的值超出了int可表示的值范围,则会导致未定义的行为。

想要将某个角色“转换”为其整数表示吗?不要过于复杂化;

int x = some_char;

char已经是整数,而不是字符串。不要将单个char视为文本。

答案 1 :(得分:2)

如果我没有弄错,atoi需要一个以空字符结尾的字符串(请参阅documentation here)。

您传入一个基于堆栈的值,该值不必以空值终止。我非常惊讶它甚至做对了:它可能会将数百个垃圾数字读入永恒,如果它从未找到空终止符。如果您只想获取单个字符的数字(例如,char的人类可读表示的数值),为什么不做int numeric = randomNumber - 48

相关问题