1

奇妙な行動に出くわしました。デバッグ中、while最初に -loop がループしたとき:コードの一部を通過した後/* "data-url" *//* "data-author" */次の結果が得られDebugging windows -> Watchesます:

(Code::Blocks IDE、Ubuntu 13.04 を使用しています)

の長さdataUrl_tempString8バイト、 の長さdataAuthor_tempString11バイト、 の長さdataName_tempString9バイトです...

1枚目の写真

しかし/* data-name */、コードの一部を実行した後、混乱する結果が得られました。

2枚目の写真

現在、サイズは 8、11、および 9 バイトではありません。

何か問題でもありますか?

そのような行動の理由を見つけるのを手伝ってくれませんか?


その関数のコードは次のとおりです。

int SubString_Search(char *fnameNew, char *strUrl, char *strAuthor, char *strName) {

    FILE *fp;
    FILE *ofp_erase;
    FILE *ofp;
    char ch_buf;
    int count = 0;

    char dataUrl[8] = "";
    char dataAuthor[11] = "";
    char dataName[9] = "";
    char *dataUrl_tempString = &dataUrl[0];
    char *dataAuthor_tempString = &dataAuthor[0];
    char *dataName_tempString = &dataName[0];


    if( (fp = fopen("output_temp.txt", "r")) == NULL) {
        printf("File could not be opened.\n");
        return (-1);
    }
    else {
        /* Erasing 'NEW' file if exists */
        ofp_erase = fopen(fnameNew, "w");
        fclose(ofp_erase);
    }



    ofp = fopen(fnameNew, "a");
    rewind(fp);

    while(!feof(fp)) {

        /* "data-url" */
        fread(dataUrl_tempString, 8, sizeof(char), fp);
        if(memcmp(dataUrl_tempString, strUrl) == 0) {
            fseek(fp, 2, SEEK_CUR);     // going up to required place to copy a string
            while( (ch_buf = getc(fp)) != '"') {
                fputc(ch_buf, ofp);
            }
            fputc('\n', ofp);
        }
        fseek(fp, -8, SEEK_CUR);


        /* "data-author" */
        fread(dataAuthor_tempString, 11, sizeof(char), fp);
        if(memcmp(dataAuthor_tempString, strAuthor) == 0) {
            fseek(fp, 2, SEEK_CUR);     // going up to required place to copy a string
            while( (ch_buf = getc(fp)) != '"') {
                fputc(ch_buf, ofp);
            }
            fputc(' ', ofp);
            fputc('-', ofp);
            fputc(' ', ofp);
        }
        fseek(fp, -11, SEEK_CUR);


        /* "data-name" */
        fread(dataName_tempString, 9, sizeof(char), fp);
        if(memcmp(dataName_tempString, strName) == 0) {
            fseek(fp, 2, SEEK_CUR);     // going up to required place to copy a string
            while( (ch_buf = getc(fp)) != '"') {
                fputc(ch_buf, ofp);
            }
            //fputc() not needed
        }
        fseek(fp, -8, SEEK_CUR); // jumping over 1 symbol from the beginning: `-8` instead of `-9`...


        count++;
        if(count == 5)
            break;
    }

    rewind(fp);
    fclose(fp);
    fclose(ofp);

    return 0;
}
4

2 に答える 2

5

文字列には終端用のスペースが必要'\0'です。8 文字の文字列に 8 バイトしか割り当てていません (したがって、最低 9 バイトが必要です)。メモリに何が続くかによって、予測できない結果が得られます。

于 2013-08-19T17:28:08.597 に答える
1

呼び出しを次のように変更することをお勧めします。

int strcmp(const char *s1, const char *s2);

への呼び出しになる

int memcmp(const void *s1, const void *s2, size_t n);

これらの(終了していない)配列str*()で関数ファミリの他のメンバーを使用しない限り、これで問題が修正されます。0char

: ただし、memcmp() 常に第 3 パラメーター ( ) として渡された文字数を比較しますn。これはあなたが望むものではないかもしれません。


アップデート:

代わりに(上記の両方の呼び出しの混合として)、次のものもあります。

int strncmp(const char *s1, const char *s2, size_t n);

またはと0のいずれかで -terminator が最大文字数まで見つかるまで比較します。s1s2n

于 2013-08-19T17:41:10.337 に答える