3

我遇到了一个非常奇怪的问题atoi(char *)。我正在尝试将 a 转换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);

GNU99在 XCode 4.6.1 中使用 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)

获取整数值。

我真的很感激所有的答案!

4

2 回答 2

6

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

从文档:

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

想要将一个字符“转换”为它的整数表示?不要把事情复杂化;

int x = some_char;

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

于 2013-04-12T01:31:20.173 回答
2

如果我没记错的话,atoi需要一个以 null 结尾的字符串(请参阅此处的文档)。

您正在传递一个基于堆栈的值,该值不必以空值结尾。我非常惊讶它甚至做对了:如果它永远找不到空终止符,它可能会永远读取数百个垃圾数字。如果您只想获取单个字符的数量(例如,字符的人类可读表示的数值),您为什么不这样做int numeric = randomNumber - 48呢?

于 2013-04-12T01:31:54.247 回答