【问题标题】:problem with strcpy() when trying to copy a string to a string尝试将字符串复制到字符串时出现 strcpy() 问题
【发布时间】:2021-07-19 16:34:51
【问题描述】:

最近又开始做一些 c 编程,目前遇到了作业问题。下面的函数应该通过为其分配内存来初始化一个字符串,这也是我需要使用 Assert() 的第一个赋值。 我必须编写dstring_initialize soo 的函数,以便以下工作:

    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) 失败,我一直在尝试不同的事情,但无法弄清楚我做错了什么。

【问题讨论】:

  • 欢迎来到 SO。请提供一个MCVE 来说明您的问题。您的 sn-p 无法编译。 DString 是什么?
  • assert(str1 == str); 可能不是您想要做的。要比较两个字符串是否相等,您必须使用strcmp。该断言检查str1str 持有的地址是否相同,这永远不会是真的。
  • 您至少应该关心输入字符串的长度。如果您只为 1 个字符分配内存,则除了 "" 之外,您永远无法存储任何内容。
  • 另外,您的返回类型是DString,但您返回的是char *。除非DStringtypedefchar *,否则肯定会导致一些问题。

标签: c function pointers assert strcpy


【解决方案1】:

首先我必须提到,在使用 C-String 时,您通常会添加长度信息。如果没有,你必须确保你的字符串都是 Null-Terminated。

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

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

【讨论】:

  • "然后你把它转换成一个字符指针,它有 4 个或 8 个字节(取决于你使用的是 32 位还是 64 位)。所以 str1 的指针必须是无效的" 呃,不他们将从 malloc 返回的指向单个字符的 void 指针从 void* 转换为 char*。给定系统上的指针类型有多大是无关紧要的。
  • 你在那儿,我改了答案。
【解决方案2】:
    assert(str1 == str);

在这一行,你比较两个指针。 在您的断言之前添加这一行:

        printf("%p\n", str1); printf("%p\n", str); printf("%d\n", str1 == str);

如果要比较两个字符串,可以使用 strcmp 为例。

但这不是很安全,您可以查看 strcmp 和 strcpy 的人了解原因。

【讨论】:

  • strcmpstrcpy 是完全安全的,只要您将它们用于已清理的数据,而不是直接用于用户输入或命令行参数等。
【解决方案3】:

您有几个基本的误解。首先,C 中没有字符串类。只有字符数组可以用作字符串,如果您在数组末尾附加一个空终止符 \0

  • DString 在 typedef 后面隐藏指针 char* 是非常糟糕的做法。你最终只会自欺欺人,当你没有时你有某种形式的字符串类。摆脱这个邪恶typedef
  • str1 = (char*)malloc(sizeof(char));这只是分配一个字符,不是很有帮助。
  • strcpy(str1, str); 这将一直复制到strcpystr 中找到空终止符。自从您通过"" 后,它立即执行此操作。所以它实际上不会复制空终止符以外的任何内容。本质上与str1[0]='\0'; 相同。
  • assert(str1 == str); 比较的是地址而不是内容。 str1str 是不同的对象,它们永远不会有相同的地址,所以这个断言总是会失败。要比较字符串内容,请使用strcmp()

从这里开始,我建议重新阅读您的 C 书籍并按顺序学习数组、指针和字符串。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-11-22
    • 2022-01-08
    • 2016-02-20
    • 1970-01-01
    • 2013-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多