fseek(fp, 0L, SEEK_SET);
int i; char c;
i = 0;
for (c = getc(fp); c != EOF; c = getc(fp)) {
c = tolower(c);
file_string[i] = c;
i++;
}
在此代码中,我读取文件的每个字符,将其转换为小写,并将其放在一个字符串中。现在,假设我将21字节* sizeof(char)分配给file_string。偶尔,在这里显示的这段代码之后,strlen(file_string)将返回30,而不是预期的20.也许我的指针算术有问题?我收集的一些事情:
1 - 这只会在某些时候发生。
2 - 我确保我正在为file_string分配正确数量的字节(在此代码之前直接发生这一行)。代码如下:
fseek(fp, 0L, SEEK_END);
file_len = ftell(fp);
file_string = malloc( sizeof(char) * (file_len+1) );
打印file_len输出预期的长度。
3 - 我打印出i的值,以确保它以file_string的长度迭代确切的次数,并且它是。
4 - 现在,直接在此代码之后(关闭文件之后),当我打印出file_string的长度时,有时它会突然增加到更大的尺寸。这导致我的代码中的其他地方出现问题。
现在,我想我可以在那里坚持使用空终端字符并解决问题(可能会导致错误进一步发生),但我更愿意知道这里有什么问题。
以下是我的调试示例,显示了之前和之后的大小变化。请记住,前面的长度对应于file_len变量。
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> file_len: 24
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>i: 0
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>i: 1
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>i: 2
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>i: 3
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>i: 4
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>i: 5
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>i: 6
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>i: 7
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>i: 8
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>i: 9
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>i: 10
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>i: 11
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>i: 12
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>i: 13
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>i: 14
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>i: 15
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>i: 16
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>i: 17
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>i: 18
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>i: 19
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>i: 20
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>i: 21
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>i: 22
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>i: 23
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> strlen(file_string): 30
答案 0 :(得分:4)
现在,我想我可以在那里坚持使用空终端字符并解决问题(可能会导致错误进一步发生),但我更愿意知道这里有什么问题。
这就是解决方案。 strlen
正在缓冲区中搜索NULL
终结符,但找不到,因为您从未添加过一个终结符。读取代码后,应明确添加NULL终止符(即file_string[i] = '\0'
)。
请记住malloc
返回的存储不归零,它基本上是随机数据(嗯...... malloc
返回的存储内容未定义)。发生的事情是你在缓冲区的末尾运行并进入随机存储器,它恰好在线下进入零字节并假设它是字符串的结尾。