gpt4 book ai didi

c - 编写一个函数来动态创建字符串的新副本并返回指向新副本的指针(C)

转载 作者:行者123 更新时间:2023-11-30 19:59:00 26 4
gpt4 key购买 nike

这是我到目前为止所拥有的,但我不知道它出了什么问题

void newCopy(char *s)
{
char newString = malloc(sizeof(int * strlen(s)));
newString = s;
return &newString;
}

最佳答案

void newCopy(char *s)
{
char newString = malloc(sizeof(int * strlen(s)));

第一个问题和第二个问题就在这里。

首先,您将 malloc(一个指针)的返回值分配给声明为 char 的变量。该变量应声明为 char*

第二,您输入的 sizeof 是错误的。

  • int * strlen(s) 是无意义的,不会编译,因为您正在尝试将类型和整数相乘。您的意思是 sizeof(int) (这是一个整数)* strlen(s) (也是一个整数)它将编译。
  • 您应该使用 sizeof(char) 而不是 sizeof(int),因为它是一个字符串。
  • 您应该在大小上加 1,因为 C 中的字符串需要用额外的 \0 以 null 结尾,而 strlen 不会报告该字符串是字符串长度的一部分。

把它们放在一起,sizeof(char)*(strlen(s)+1)

  newString = s;

第三个问题来了。 = 不是一个魔术运算符 - 它将变量 s(这是一个指针)中的值分配给变量 newString 中的值(修复上述错误后,它也将是一个指针)。除此之外它什么也不做。

您想要做的是使用 strcpy,这是一个将一个字符串的内容(通过跟随其指针)复制到另一个字符串的内容(通过跟随其指针)的函数。 http://www.cplusplus.com/reference/cstring/strcpy/

  return &newString;

第四和第五个问题就在这里。

第四是,您已将函数声明为 void 并且在这里您试图返回一个 char*。

第五,您试图返回一个指向在堆栈上声明的内容(局部变量)的指针。一旦函数返回,该函数堆栈上的任何内容都是垃圾,不能再被引用。

但是,如果您正确地将 newString 设为 char* 类型,那么您所需要做的就是 return newString; 并且您正确地返回了指针按值指向堆(感谢早期的 malloc)。

}

最后,从这段代码来看,我应该告诉你,C 不是一种对新手友好的语言,你可以只输入“看起来像”你想要发生的事情,然后祈祷它能起作用。如果你犯了一点点错误,你的代码就会崩溃,而你不知道为什么,因为你不知道做事的正确方法。要么阅读一本关于 C 语言的好书,并逐步自学从基础到高级的所有内容,这样您就知道它是如何工作的,或者选择一种对用户更友好的语言。

关于c - 编写一个函数来动态创建字符串的新副本并返回指向新副本的指针(C),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16930134/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com