如何解决尝试将字符串复制到字符串时 strcpy() 的问题
最近又开始做一些 c 编程,目前有一个作业有问题。以下函数应该通过为其分配内存来初始化字符串,这也是我需要使用 Assert() 的第一个赋值。
我必须编写 dstring_initialize
的函数,以便以下工作:
DString str1,str2;
str1 = dstring_initialize("");
dstring_delete(&str1);
assert(str1 == NULL);
这可能是我搞砸了一些基本的东西,这就是函数目前的样子:
DString dstring_initialize(const char* str)
{
assert(str != NULL);
char* str1;
str1 = (char*)malloc(sizeof(char));
strcpy(str1,str);
assert(str1 == str);
return str1;
}
我收到的错误消息是最后一个 Assert,Assert(str1 == str)
失败,我一直在尝试不同的事情,但无法弄清楚我做错了什么。
解决方法
您有几个基本的误解。首先,C 中没有字符串类。如果在数组末尾附加一个空终止符 \0
,只有字符数组可以用作字符串。
-
DString
在 typedef 后面隐藏指针char*
是非常糟糕的做法。当你没有时,你最终只会自欺欺人地认为你有某种形式的字符串类。摆脱这个邪恶的typedef
。 -
str1 = (char*)malloc(sizeof(char));
这只分配一个字符,不是很有帮助。 -
strcpy(str1,str);
这将复制直到strcpy
在str
中找到空终止符。自从您通过""
后它立即执行。所以它实际上不会复制除空终止符以外的任何内容。它本质上与str1[0]='\0';
相同。 -
assert(str1 == str);
比较地址而不是内容。str1
和str
是不同的对象,它们永远不会有相同的地址,所以这个断言总是会失败。要比较字符串内容,请使用strcmp()
。
从这里开始,我建议您重新阅读您的 C 书并按顺序学习数组、指针和字符串。
, assert(str1 == str);
在这一行,您比较两个指针。 在您的断言之前添加这一行:
printf("%p\n",str1); printf("%p\n",str); printf("%d\n",str1 == str);
如果要比较两个字符串,可以使用 strcmp 为例。
但这不是很安全,您可以查看 strcmp 和 strcpy 的 man 以了解原因。
,首先我要提到的是,当使用 C-Strings 时,您通常会添加长度信息。如果不是,你必须确保你的字符串都是空终止的。
其次,这一行 str1 = (char*)malloc(sizeof(char));
没有意义,因为您只分配了一个字符。
第三,你在比较你得到的指针和我刚刚提到的无效指针,而不是字符串本身。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。