当前位置:  开发笔记 > 编程语言 > 正文

制作一份char*的副本

如何解决《制作一份char*的副本》经验,为你挑选了2个好方法。

我有一个函数接受char*作为其参数之一.我需要操纵它,但保留原始的char*.基本上,我想创建这个char*的工作副本.看起来这应该很容易,但我真的很挣扎.

我的第一个(幼稚)尝试是创建另一个char*并将其设置为等于原始:

char* linkCopy = link;

当然,这不起作用,因为我所做的只是让他们指向同一个地方.

我应该使用strncpy来实现这一目标吗?

我尝试过以下操作,但会导致崩溃:

char linkCopy[sizeof(link)] = strncpy(linkCopy, link, sizeof(link));

我错过了一些明显的东西......?

编辑:我很抱歉,我试图简化示例,但我在第二个示例中留下了一些较长的变量名称.固定.



1> Johannes Sch..:

sizeof会给你指针的大小.通常为4或8,具体取决于您的处理器/编译器,但不是指向的字符串大小.你可以使用strlen和strcpy:

// +1 because of '\0' at the end
char * copy = malloc(strlen(original) + 1); 
strcpy(copy, original);
...
free(copy); // at the end, free it again.

我已经看到一些答案建议使用strdup,但这是一个posix函数,而不是C的一部分.



2> Sean Bright..:

您可能想看一下strdup(man strdup)函数:

char *linkCopy = strdup(link);

/* Do some work here */

free(linkCopy);

编辑:因为你需要它是标准的C,所以像其他人指出的那样:

char *linkCopy = malloc(strlen(link) + 1);
/* Note that strncpy is unnecessary here since you know both the size
 * of the source and destination buffers
 */
strcpy(linkCopy, link);

/* Do some work */

free(linkCopy);

由于strdup()不在ANSI/ISO标准C中,如果它在编译器的运行时中不可用,请继续使用:

/*
**  Portable, public domain strdup() originally by Bob Stout
*/

#include 
#include 

char* strdup(const char* str)
{
      char* newstr = (char*) malloc( strlen( str) + 1);

      if (newstr) {
          strcpy( newstr, str);
      }

      return newstr;
}

推荐阅读
女女的家_747
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有