gpt4 book ai didi

C 字符串分配

转载 作者:行者123 更新时间:2023-11-30 19:11:26 24 4
gpt4 key购买 nike

嘿,我想回顾一下我以前的 C 语言使用知识。我想为 C 字符串分配内存,然后写入该缓冲区或从此缓冲区读取 C 字符串。我记得每个字符数组末尾有一个类似 '\0' 的东西来表示 C 字符串。

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

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

感谢您对这个问题的澄清。

最佳答案

你或多或少是正确的。我对此代码的注释

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

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

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 ?? ??

??表示该内存可能具有任何值。

如果我执行“write(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 语言的东西,并且在文件中没有类似物。

如果我执行“read(fd, buf, 8)”,那么我的缓冲区最终将是:

H E L L O \n W O

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

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

关于C 字符串分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40083241/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com