为什么我的字符串大小会改变? (C)

时间:2014-11-20 16:10:46

标签: c string string-length c-strings

    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

1 个答案:

答案 0 :(得分:4)

  

现在,我想我可以在那里坚持使用空终端字符并解决问题(可能会导致错误进一步发生),但我更愿意知道这里有什么问题。

这就是解决方案。 strlen正在缓冲区中搜索NULL终结符,但找不到,因为您从未添加过一个终结符。读取代码后,应明确添加NULL终止符(即file_string[i] = '\0')。

请记住malloc返回的存储不归零,它基本上是随机数据(嗯...... malloc返回的存储内容未定义)。发生的事情是你在缓冲区的末尾运行并进入随机存储器,它恰好在线下进入零字节并假设它是字符串的结尾。