fseek()之后的奇怪行为已经奏效

时间:2013-08-19 17:23:13

标签: c debugging fseek

我遇到了一种奇怪的行为。在调试时,当while - 循环第一次循环时:经过/* "data-url" *//* "data-author" */部分代码后,我在Debugging windows -> Watches中得到了下一个结果:

(我正在使用Code :: Blocks IDE,Ubuntu 13.04)

dataUrl_tempString的长度为 8 字节, dataAuthor_tempString的长度为 11 字节, dataName_tempString的长度为 9 字节...

1st pic

但经过/* data-name */部分代码后,我的结果让我感到困惑:

2nd pic

现在它们的大小不是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;
}

2 个答案:

答案 0 :(得分:5)

字符串需要有'\0'终止空间 - 您只为8个字符的字符串分配了8个字节(因此最少需要9个字节)。根据内存中的内容,您将得到不可预测的结果。

答案 1 :(得分:1)

您可能希望将通话更改为

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

成为

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

这将解决问题,只要您不在这些(非str*() - 已终止的)0数组上使用char函数族的其他成员。

注意:但memcmp() 始终会比较作为第三个参数(n)传递的字符数。这可能不是你想要的。


<强>更新

Alternativly(上面两个调用的混合)还有:

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

0s1以及最多s2个字符中找到n - 终结符之前进行比较。