0

こんにちは私はに奇妙な問題がありsprintfます。これが私のコードです:

void draw_number(int number,int height,int xpos,int ypos){
    char string_buffer[5]; //5000 is the maximum score, hence 4 characters plus null character equals 5
    printf("Number - %i\n",number);
    sprintf(string_buffer,"%i",number); //Get string
    printf("String - %s\n",string_buffer);
    int y_down = ypos + height;
    for (int x = 0; x < 5; x++) {
        char character = string_buffer[x];
        if(character == NULL){ //Blank characters occur at the end of the number from spintf. Testing with NULL works
            break;
        }
        int x_left = xpos+height*x;
        int x_right = x_left+height;
        GLfloat vertices[] = {x_left,ypos,x_right,ypos,x_left,y_down,x_right,y_down};
        rectangle2d(vertices, number_textures[atoi(strcat(&character,"\0"))], full_texture_texcoords);
    }
}

そこでのprintf呼び出しで、番号は正常に印刷され、番号は期待どおりに描画されます。もちろん、それらを取り除くと、出力を表示して比較することはできませんが、数値は正しくレンダリングされません。sprintfどういうわけか休憩だと思います。

これは。でも発生しNSLogます。NSLogプログラムのどこかに'sを追加すると、関数が壊れたり修正されたりする可能性があります。

一体何が起こっているのですか?

これは、iOS4SDKでObjective-Cを使用しています。

ご回答ありがとうございます。

4

4 に答える 4

4

まあ、このコードは間違いなく奇妙です

char character = string_buffer[x]; 
...
... strcat(&character,"\0") ...

もともと私は、スタックに NUL ターミネータがいつ発生するかによって、メモリの一部が失われ、問題が発生する可能性があると考えていました。ただし、空の文字列を追加しているため、効果はないと思います。

おそらく、スタックの内容には解釈中の数値が実際に含まれているのでatoiはないでしょうか?いずれにしても、それを修正して、問題が解決するかどうかを確認することをお勧めします。

それを修正する方法については、Georg Fritzsche が私を打ち負かしました。

于 2010-09-01T13:38:36.763 に答える
2

strcat(&character,"\0")単一の文字を文字配列として使用しようとしています。これにより、atoi()予想とはまったく異なる値が返されるか(nullで終了しないため)、単にクラッシュする可能性があります。

元のアプローチを修正するには、適切なゼロで終了する文字列を使用できます。

char number[] = { string_buffer[x], '\0' };
// ...
... number_textures[atoi(number)] ...

しかし、さらに簡単なのは、単に以下を使用することです。

... number_textures[character - '0'] ...
于 2010-09-01T13:44:32.477 に答える
1

文字との比較に NULL を使用しないでください。探している文字であるため、'\0' を使用してください。また、あなたのコードのコメントは驚きに聞こえます。もちろん、文字列の最後に「\ 0」が発生します。これが、C が文字列を終了する方法です。

数値が 9999 を超えると、バッファ オーバーフローが発生し、予期しない結果が生じる可能性があります。

于 2010-09-01T13:53:43.327 に答える
1

このような問題が発生した場合は、すぐにスタックまたはヒープの破損を考えてください。十分なサイズのバッファを動的に割り当てる必要があります。固定サイズとしてバッファを使用すると、この種の問題が発生します。数値が最大値内であることを確認しないため、最大値を超える原因となった別のバグがあった場合、ここでこの問題が発生します。

于 2010-09-01T13:53:49.130 に答える