【发布时间】:2022-01-24 10:41:39
【问题描述】:
我遇到了这个 C 程序的问题,它读取文件的内容并将其复制到字符串中,然后打印出来。 当我分配一个字符串时,它总是有 3 个奇怪的字符,我可以通过将 '\0' 放在开头来将其初始化为一个空字符串来解决这个问题,如第 1 部分和第 2 部分所示。 但是在读取文件时,即使使用这种技术,也不会出现 3 个字符,如第 3 部分所示。
任何人都知道为什么要打印这 3 个字符,知道如果我将字符串复制到另一个文件中,它们不会出现在其中;为什么当我阅读文件时它们仍然出现?
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define length 20
int main() { /////////PART 1
char *T = (char*) malloc((length+1)*sizeof(char)) ;
printf("%s\n", T);
strcat(T, "hello") ;
printf("%s\n", T);
////////////////////////////////////PART 2
char *M = (char*) malloc((length+1)*sizeof(char)) ; M[0] = '\0' ;
printf("%s\n", M);
strcat(M, "hello") ;
printf("%s\n", M);
////////////////////////////////////PART 3
FILE *fil = fopen("test.txt", "r") ;
char *S = (char*) malloc((length+1)*sizeof(char)) ; S[0] = '\0' ;
fread(S, sizeof(char), length, fil);
S[length] = '\0' ;
printf("%s\n", S) ;
fclose(fil) ;
}
【问题讨论】:
-
永远不要假设
malloc返回的内存内容。 -
如果你想初始化内存使用 calloc:
char *t = calloc(length+1, 1)。如果t不为 NULL(请务必检查),它指向的内存将被设置为全零。 -
strcat(T, "hello") ;在初始化T之前你不能这样做。您需要像在其他示例中一样,在调用strcpy之前将手动空终止符附加到索引 0 -
如果它只发生在第 3 部分,在读取该特定文件后(您说如果将文本复制到另一个文件就不会发生),该文件可能会以字符编码 UTF- 8 物料清单。这有一个 3 个字符的签名。这意味着这三个字符是文件的一部分,而不是 malloc 的错误。
-
试试
printf(%x %x %x\n", S[0], S[1], S[2]);。如果你得到ef bb bf,那就是Byte Order Mark。
标签: c string dynamic-memory-allocation