3

で非常に奇妙な問題が発生していatoi(char *)ます。charaを数値表現 (数値であることはわかっています) に変換しようとしていますが、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);

GNU99XCode 4.6.1 で C 言語方言を使用しています。最初の if (最初の数値が 2 番目の数値と等しくない場合) はログに記録されないため、2 つの 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 で終わる文字列が必要です (こちらのドキュメントを参照してください)。

null で終わる必要のない単一のスタックベースの値を渡しています。それが正しく行われていることにも非常に驚いています。null ターミネータが見つからない場合、何百ものゴミの数字を永遠に読み込んでいる可能性があります。単一の char の数 (char の人間が読み取れる表現の数値など) を取得したいだけなら、なぜそうしないのでしょうint numeric = randomNumber - 48か?

于 2013-04-12T01:31:54.247 に答える