1

strtol は、テキスト ファイルを読み取って取得した文字列を変換しません。

int getNumFiles(int archive){
off_t cur=lseek(archive,20,SEEK_SET);
if(cur==-1){
    printf("lseek ERROR\n");
    exit(-1);
}
bool b=true;
char headerSizeBuffer[4];
char *end;

while(b){
    int numRead=read(archive,headerSizeBuffer,3);
    if(numRead != 3){
        printf("read ERROR\n");
        exit(-1);
    }
    headerSizeBuffer[3]='\0';
    printf("headerSizeBuffer=%s  with length=%ld\n",headerSizeBuffer,strlen(headerSizeBuffer));
    long headerSize=strtol(headerSizeBuffer,&end,10);//atol(headerSizeBuffer);
    printf("headerSize=%ld\n",headerSize);

    if (!*end)
        printf("Converted successfully\n");
    else
        printf("Conversion error, non-convertible part: %s\n", end);
    b=false;
}

return 1;

}

コンパイルされたコードを実行すると、コンソールにこれが表示されます

headerSizeBuffer=031l_archive  with length=12
headerSize=31
Conversion error, non-convertible part: l_archive

やりたいことは、031 を値 31 の long または int に変換することだけです。

4

2 に答える 2

3

おそらく、headerSizeBufferにスペースまたは十分なスペースを割り当てておらず、printfの呼び出し(開始)からstrtolの呼び出し(終了)までの間に上書きされています。

編集:上記のコメントから: "char * headerSizeBuffer"

うん、私は正しかった。スペースを割り当てていないため、未定義の動作があります...これは、表示されているものを含め、任意の動作が発生する可能性があることを意味します。十分なメモリ(mallocからのもの、配列、またはその他のあまり一般的ではない手段)を指すように設定するか、サイズが大きいため、headerSizeBufferに十分なスペースを割り当てるようにしてください。必要なものはコンパイル時に認識され、ポインターではなく配列として宣言されます。

char headerSizeBuffer[4];

文字列をstrtolに渡す前に、必ずheaderSizeBuffer [3]='\0`を設定して文字列を終了してください。

于 2013-01-27T02:19:37.557 に答える
1

これは、3 文字しかないstrtolのに、ヌルで終わる文字列が必要なためです。その後、文字列の終わりが見えず、ゴミを読み続けます。を設定する必要があります。read()strtolheaderSizeBuffer[3] = 0

于 2013-01-27T02:06:44.483 に答える