C fseek()工作后的奇怪行为

C fseek()工作后的奇怪行为,c,debugging,fseek,C,Debugging,Fseek,我遇到了一个奇怪的行为。调试时,当While-循环第一次循环时:经过/*“数据url”*/和/*“数据作者”*/部分代码后,我将在调试窗口->监视中获得下一个结果: (我正在使用代码::Blocks IDE,Ubuntu 13.04) dataUrl\u tempString的长度为8字节, dataAuthor\u tempString的长度为11字节, dataName\u tempString的长度为9字节 但是经过/*数据名*/部分代码之后,我得到了一个让我困惑的结果: 现在它们的大

我遇到了一个奇怪的行为。调试时,当
While
-循环第一次循环时:经过
/*“数据url”*/
/*“数据作者”*/
部分代码后,我将在
调试窗口->监视
中获得下一个结果:

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

dataUrl\u tempString
的长度为8字节,
dataAuthor\u tempString
的长度为11字节,
dataName\u tempString
的长度为9字节

但是经过
/*数据名*/
部分代码之后,我得到了一个让我困惑的结果:

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

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

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

您可能希望将调用更改为

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

int memcmp(const void *s1, const void *s2, size_t n);
只要不在那些(非
0
-终止的)
char
数组上使用
str*()
函数系列的其他成员,这将解决问题

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


更新:

另外(作为上述两个调用的混合)还有:

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

它会进行比较,直到在
s1
s2
中找到
0
-终止符,最多可找到
n
个字符。

您可能希望将调用更改为

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

int memcmp(const void *s1, const void *s2, size_t n);
只要不在那些(非
0
-终止的)
char
数组上使用
str*()
函数系列的其他成员,这将解决问题

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


更新:

另外(作为上述两个调用的混合)还有:

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


它会一直比较,直到在
s1
s2
中找到一个
0
-终止符,并且最多可以找到
n
个字符。

是的-我一下子就知道它会是那样或strlen()。你是说
dataUrl\u tempString
变量吗?我将它们作为数组而不是字符串进行操作。
dataUrl\u tempstring
指向
dataUrl[8]
-因此您只“拥有”前八个字节。字符串需要终止。你没有足够的空间,所以任何事情都有可能发生。呃,我一直在用strcmp
to
dataUrl\u tempString
。。。我将删除此错误,如果有帮助,我将接受您的回答。@YulianKhlevnoy使用
strncmp()
memcmp()
。是的-我一下子就知道它将是that或strlen()。您是指
dataUrl\u tempString
变量吗?我将它们作为数组而不是字符串进行操作。
dataUrl\u tempstring
指向
dataUrl[8]
-因此您只“拥有”前八个字节。字符串需要终止。你没有足够的空间,所以任何事情都有可能发生。呃,我一直在用strcmp
to
dataUrl\u tempString
。。。我将删除此错误,如果有帮助,我将接受您的回答。@YulianKhlevnoy可以使用
strncmp()
memcmp()
代替。旁注:
而(!feof(fp))
是。在这里,它是错误的,但无害的,就像当(1)
fseek
清除
feof
指示器)时的
break
处理它。OT:
sizeof(Char)
总是
1
。始终检查系统调用的结果。@alk,我读过一本关于C的书,刚刚开始阅读S.McConnell的“代码完成”,我想我以后会听从你的建议。。。但不是现在;)旁注:
而(!feof(fp))
是。在这里,它是错误的,但无害的,就像当(1)
fseek
清除
feof
指示器)时的
break
处理它。OT:
sizeof(Char)
总是
1
。始终检查系统调用的结果。@alk,我读过一本关于C的书,刚刚开始阅读S.McConnell的“代码完成”,我想我以后会听从你的建议。。。但不是现在;)所以
memcmp()
对数组的作用就像
strcmp()
对字符串的作用一样?我想将数组作为字符串进行比较。@YulianKhlevnoy:请看我刚才在回答中添加的注释。第三个参数是什么?@YulianKhlevnoy非常好!我知道你在说什么:)你将字符串存储在内存中的连续位置,这些位置最初都设置为零。从您显示的输出可以推断字符串存储的顺序为url、name、author。通过更改字符串向自己证明这一点(因此每个字符串的开头都不同)。使用“中间字符串”(名称)后,唯一的字符串终止在块的末尾(在作者之后)。给自己更多的空间。要求显示字符串的任何内容都会查找
'\0'
,并一直运行直到找到它(或segfaults)。因此
memcmp()
对数组的作用与
strcmp()
对字符串的作用一样?我想将数组作为字符串进行比较。@YulianKhlevnoy:请看我刚才提到的注释