尝试将字符串复制到字符串时 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); 这将复制直到 strcpystr 中找到空终止符。它在您通过 "" 后立即执行此操作。所以它实际上不会复制空终止符以外的任何内容。它与 str1[0]='[=19=]';.
  • 本质上是一样的
  • assert(str1 == str); 比较 地址 而不是内容。 str1str 是不同的对象,它们永远不会有相同的地址,所以这个断言总是会失败。要比较字符串 内容 ,请使用 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));没有意义,因为你只分配了一个字符。

第三,你比较的是你得到的指针和我刚才提到的无效指针,而不是字符串本身。