【发布时间】:2011-12-26 06:38:48
【问题描述】:
我正在尝试为我正在开发的包装器做一些有用的事情。我正在为 C 的标准字符串库编写一个包装器,因为我不喜欢它。
我现在不想将 C 字符串引入我的包装器。我有一个名为 `str 的结构,其中包含字符串的长度和缓冲区:
struct str
{
char *buf;
size_t len;
};
在我的头文件中,我有这个:
typedef struct str str;
现在我已经实现了封装(我认为)。
所以我声明这样的字符串:
str *a_string = NULL;
我已经完成了我想做的所有事情,但是我有一个问题。我想为一个功能添加这样的东西:
str.h:
extern str *str_str(str *, char *);
和str.c
str *str_str(str *buf, char *ns)
{
buf->len = strlen(ns);
buf->buf = (char *) malloc(buf->len + 1);
strncpy(buf->buf, ns, buf->len);
return buf;
}
测试效果很好:
str *s = str_new();
printf("%s\n", str_cstr(str_str(s, "hello")));
output: hello
但这会起作用吗?
str_assign(s, str_str(s, "ok"));
我认为这实际上是将s 分配给s。当我打印时,它什么也不打印!
我没有收到任何错误! 非常感谢所有帮助。我是 C 语言的新手。
str_assign()的来源:
void str_assign(str *s1, str *s2)
{
s1->len = s2->len;
s1->buf = (char *) malloc(s2->len + 1);
strncpy(s1->buf, s2->buf, s2->len);
}
【问题讨论】:
-
你为什么输入代码而不是复制粘贴?那是愚蠢的。选择代码,按 Ctrl+C,然后进入浏览器并按 Ctrl+V。在 str_str 的正文中,我认为您的意思是写
strlen(ns)而不是strlen(s)。 -
您忘记在
str_str中添加return语句,所以它不会编译,否则它会做坏事。 -
我的意思是 ns,对不起。这还不够信息吗?我刚刚发布了问题。这两个函数与 .c 文件中编写的函数相同。我确实在我的源代码中的 str_str 中返回了 s,我一定忘记在我的文档中添加 return 语句。
-
我认为您的
str_assign函数中存在一个错误,当两个参数是相同的字符串时,它会导致它无法工作。把那个源码贴出来,这次用复制粘贴。 -
发布
str_assign的代码。在分配新值之前,它是free()当前的str.buf吗?你会测试自我分配吗?