尝试将字符串复制到字符串时 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); 这将复制直到 strcpystr 中找到空终止符。自从您通过 "" 后它立即执行。所以它实际上不会复制除空终止符以外的任何内容。它本质上与 str1[0]='\0'; 相同。
  • 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-Strings 时,您通常会添加长度信息。如果不是,你必须确保你的字符串都是空终止的。

其次,这一行 str1 = (char*)malloc(sizeof(char)); 没有意义,因为您只分配了一个字符。

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