C字符串分配

时间:2016-10-17 09:50:28

标签: c

嘿,我想对我对C语言使用的旧知识进行一些回顾。我想为C字符串分配内存然后写入此缓冲区或从此缓冲区读取C字符串。我记得有什么像' \ 0'在每个字符数组的末尾表示C字符串。

总是将字符串分配为(STRLEN + 1)并在读取或写入时(文件,套接字等)执行相同操作也是正确的。

char *myCString = malloc(sizeof(char)*(STRLEN+1)) 
read(fd, buff, STRLEN+1); 
write(fd, buff, STRLEN+1); 

感谢您澄清此问题。

1 个答案:

答案 0 :(得分:1)

你或多或少是正确的。我对这段代码的说明

char *myCString = malloc(sizeof(char)*(STRLEN+1)) 

这确实分配了STRLEN + 1字节的缓冲区(如果sizeof(char)是一个字节)。 STRLEN应该是您期望读取的最大字节数。编译器可能会抱怨,因为malloc返回一个void *类型,并将它存储在char *中。在malloc调用中添加(char *)类型转换。

read(fd, buff, STRLEN+1); 

这将从文件句柄fd中将最多(STRLEN + 1)个字节读入缓冲区,称为“buff”。除了你已经调用缓冲区'myCString'之外,这是好的。但是,此读取不会在从文件读取的字符末尾添加“\ 0”,并且不会在行尾停止。

如果您正在尝试读取和写入行,那么我建议您阅读有关fopen / fclose / fprintf / fputs / fscanf / fgets的内容。这些是用于对文件执行字符串IO的传统C库函数。

write(fd, buff, STRLEN+1); 

无论字符串在缓冲区中的长度如何,都会将(STRLEN + 1)字节写入文件。

例如,假设STRLEN = 7(所以你有8个字符的缓冲区)。我们假设您在缓冲区中有“HELLO”这个词。

记忆将是:

0  1  2  3  4  5  6  7  
H  E  L  L  O  \0 ?? ??

??表示该记忆可能有任何价值。

如果我'写(fd,buf,8)',那么它会将所有8个字节写入文件。该文件将以:

结束
H E L L O \0 ?? ??

我希望你宁愿在文件中有5个字节(H E L L O)

作为阅读的一个例子,假设你有一个包含2行的文件,带有unix文件结尾。它可能看起来像:

H E L L O \n W O R L D \n

(其中\ n =新行字符)

请注意文件中没有\ 0字符。 \ 0作为缓冲区终止符是C的东西,并且在文件中没有模拟。

如果我确实'读过(fd,buf,8),那么我的缓冲区将以:

结束
H E L L O \n W O

读取8个字符,字符串末尾没有'\ 0'。如果我试图打印它然后我会失败,因为没有\ 0。

正确的函数是fgets和fputs,它们将读取和写入字符串,并考虑到\ n。