尝试将字符串复制到字符串时 strcpy() 出现问题
problem with strcpy() when trying to copy a string to a string
最近又开始做一些 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(str1 == str)
失败了,我一直在尝试不同的方法,但无法弄清楚我做错了什么。
你有几个基本的误解。首先,C 中没有字符串 class。只有字符数组可以用作字符串,如果在数组末尾附加空终止符 [=10=]
。
DString
将指针 char*
隐藏在 typedef 后面是非常糟糕的做法。当你没有时,你最终只会自欺欺人地认为你有某种形式的字符串 class 。摆脱这个邪恶typedef
.
str1 = (char*)malloc(sizeof(char));
这只分配一个字符,不是很有用。
strcpy(str1, str);
这将复制直到 strcpy
在 str
中找到空终止符。它在您通过 ""
后立即执行此操作。所以它实际上不会复制空终止符以外的任何内容。它与 str1[0]='[=19=]';
. 本质上是一样的
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 字符串时,您通常会添加长度信息。如果不是,您必须确保您的字符串都是空终止的。
其次,这一行str1 = (char*)malloc(sizeof(char));
没有意义,因为你只分配了一个字符。
第三,你比较的是你得到的指针和我刚才提到的无效指针,而不是字符串本身。
最近又开始做一些 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(str1 == str)
失败了,我一直在尝试不同的方法,但无法弄清楚我做错了什么。
你有几个基本的误解。首先,C 中没有字符串 class。只有字符数组可以用作字符串,如果在数组末尾附加空终止符 [=10=]
。
DString
将指针char*
隐藏在 typedef 后面是非常糟糕的做法。当你没有时,你最终只会自欺欺人地认为你有某种形式的字符串 class 。摆脱这个邪恶typedef
.str1 = (char*)malloc(sizeof(char));
这只分配一个字符,不是很有用。strcpy(str1, str);
这将复制直到strcpy
在str
中找到空终止符。它在您通过""
后立即执行此操作。所以它实际上不会复制空终止符以外的任何内容。它与str1[0]='[=19=]';
. 本质上是一样的
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 字符串时,您通常会添加长度信息。如果不是,您必须确保您的字符串都是空终止的。
其次,这一行str1 = (char*)malloc(sizeof(char));
没有意义,因为你只分配了一个字符。
第三,你比较的是你得到的指针和我刚才提到的无效指针,而不是字符串本身。