我遇到了一种奇怪的行为。在调试时,当while
- 循环第一次循环时:经过/* "data-url" */
和/* "data-author" */
部分代码后,我在Debugging windows -> Watches
中得到了下一个结果:
(我正在使用Code :: Blocks IDE,Ubuntu 13.04)
dataUrl_tempString
的长度为 8 字节,
dataAuthor_tempString
的长度为 11 字节,
dataName_tempString
的长度为 9 字节...
但经过/* data-name */
部分代码后,我的结果让我感到困惑:
现在它们的大小不是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 :(得分: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);
在0
或s1
以及最多s2
个字符中找到n
- 终结符之前进行比较。