1

ファイルがあるとしましょう。すべてのバイトを unsigned char バッファに読み込みました。そこから、長さを知らずに ac 文字列 (null で終了) を読み取ろうとしています。

私は次のことを試しました:

char* Stream::ReadCString()
{
    char str[0x10000];
    int len = 0;
    char* pos = (char*)(this->buffer[this->position]);
    while(*pos != 0)
        str[len++] = *pos++;
    this->position += len+ 1;
    return str;
}

文字がnullで終了しているかどうかを確認しながら、str配列の各文字を埋めることができると思いました。これは機能していません。何か助けはありますか?

this->buffer = バイト配列
this->position = 配列内の位置

これを行う他の方法はありますか?実際のバッファのアドレスで実行できると思います: str[len++] = *(char*)(this->buffer[this->position++])?

更新: 私の新しい機能:

char* Stream::ReadCString()
{
    this->AdvPosition(strlen((char*)&(this->buffer[this->position])) + 1);
    return (char*)&(this->buffer[this->position]);
}

そしてそれを呼び出す:

printf( "String: %s\n", s.ReadCString()); //tried casting to char* as well just outputs blank string

サンプルファイル: ここに画像の説明を入力

4

4 に答える 4

0

注意を払っている限り、null 終了はおそらく最善の方法ですが、それが機能しない理由は、スタックに割り当てられたメモリを返すためである可能性が最も高いです。このメモリは、リターンを押すとすぐに解放されるため、未定義の動作が発生します。代わりに、ヒープに文字を割り当てます。

char* str = new char[0x10000];

呼び出し元がメモリを必要としなくなったら、メモリを解放します。

于 2013-07-23T08:07:32.830 に答える