2017-10-18 108 views
0

目标覆盖第一字符数组的fread之后是用C来读取文件数据(可以是文本或二进制),然后附加到现有的字符串第二字符数组从文件

我有2个字符数组,一个一个现有的字符串(S1),并且另一个字符串(S2),我会追加缓冲char数组(BUF)到

size_t readCounter = 0; 
char buf[16]; 
char s1[] = "hello "; 
char s2[] = "" 

while (1) { 
    readCounter = fread(buf, sizeof(char), strlen(buf), fp); 

    if (readCounter == 0) { 
     break; 
    } 

    strcat(s2, buf);  
} 

printf("%s", s1); 
printf("%s", s2); 

问题:

当我打印出S1,它不再是“你好“,它包含文件中的字符,因此第一个字符数组在内存中被覆盖。为什么会发生?我该如何解决这个问题?

+2

'buf'永远不会被初始化,所以当你调用'strlen'的时候,你在这里要求爆炸。 – tadman

+0

好吧,我把16(缓冲区的大小),以取代strlen(buf) – user3226932

+0

这可能是更好的避免这样的神奇数字,而是使用'sizeof(buf)'。 – tadman

回答

4
readCounter = fread(buf, sizeof(char), strlen(buf), fp); 

这是一个问题。此时,buf不包含字符串,因此将它传递给strlen是一个错误。

另外:

char s2[] = ""; 
... 
strcat(s2, buf); 

这是不好的。当你全部位于s2时,它指向一个空字符串。所以这个数组的大小可以容纳一个空字符串。通过传递s2strcat,您试图追加到它上面 - 但它没有任何额外的空间。

+0

我明白了,但是这与s1有什么关系,为什么s1被覆盖? – user3226932

+0

@ user3226932在你犯这样的错误之后,你无法可靠地访问任何东西。编译器可以自由优化,假设你永远不会这么做,并且一旦违反该假设,所有投注都将关闭。也许'strcat'恰好在当时正在使用的内存上乱涂乱画。也许不会。 –

+0

未定义的行为。 '这与s1有什么关系,s1为什么被覆盖?什么? s2和s1彼此相邻,所以超越的人会爆炸另一个并不奇怪。 –