如何从字符数组复制到字符指针?

3

我正在尝试从字符数组复制到字符指针。

我的代码:

char str[] = "Hello World";
char *result = (char *)malloc(strlen(str)+1);
int index=0;
while(index <= strlen(str))
{
  *result = str[index];
  result++;
  index++;
}

这段代码不起作用,下面的代码可以正常运行。
char str[] = "Hello World";
char *result = (char *)malloc(strlen(str)+1);
int index=0;
while(index <= strlen(str))
{
  result[index] = str[index];
  index++;
}

有人能解释一下这种行为吗?

4
第一段代码基本可行,但问题在于你修改了指针,因此循环结束后它将不再指向原始位置。如果你再创建一个指针变量,在循环之前让它也指向 result,那么就能解决这个问题。 - Some programmer dude
1
你应该使用 index <= strlen(str) - '小于等于' 而不是 '小于'. - CiaPan
2
注意,反复调用strlen是低效的。毕竟它不会改变。 - MSalters
1
回答标题中的问题,使用 strcpy(result,str) - user3386109
1
你会打印出什么结果?是指 result 所指向的那个吗?但是 result 变量在循环之前已经不再是原来的样子了!你在循环内多次对它进行了递增,所以现在它指向了复制字符串的末尾... - CiaPan
显示剩余9条评论
6个回答

9
我们只需使用strcpy函数将数组复制到指针中即可。
     char str[] = "Hello World";
     char *result = (char *)malloc(strlen(str)+1);
     strcpy(result,str);

我想以自己的方式实现strcpy()。 - dcds

8
在第一个片段中,您在循环中修改指针,因此在循环结束后,它将不再指向malloc调用返回的相同位置。
可以这样看待,在调用malloc后,指针和内存如下所示:
result
|
v
+---+---+---+---+---+---+---+---+---+---+---+---+
|   |   |   |   |   |   |   |   |   |   |   |   |
+---+---+---+---+---+---+---+---+---+---+---+---+
在循环的第一次迭代之后,它将如下所示:
    result
    |
    v
+---+---+---+---+---+---+---+---+---+---+---+---+
| H |   |   |   |   |   |   |   |   |   |   |   |
+---+---+---+---+---+---+---+---+---+---+---+---+
循环完成后,它将如下所示:
                                                 result
                                                 |
                                                 v
+---+---+---+---+---+---+---+---+---+---+---+----+
| H | e | l | l | o |   | W | o | r | l | d | \0 |
+---+---+---+---+---+---+---+---+---+---+---+----+
复制已完成,但指针不再指向原始位置。
[注意:在复制之前,由malloc分配的内存不会以任何方式“空白”或初始化,我只是为了简单起见在这里显示它。]

3
也许我们应该补充一下,使用 result 指针的这种方式,原帖作者甚至无法再使用 free 函数对其进行释放;这就是为什么在大多数情况下我更喜欢使用数组符号,因为它更易读。 - Giorgi Moniava

4

尝试使用以下代码,使用strcpy()函数。

char str[] = "Hello World";
char *result = (char *)malloc(strlen(str)+1);
strcpy(result,str);

2

您已经为该指针分配了内存,因此可以简单地使用strcpy()函数复制字符。

 strcpy(result,str);

字符串已经复制到结果中。


我想最好使用strncpy而不是strcpy。 - sudhir
@sudhi - 如果我们想要复制指定长度的字符,那么我们可以使用 strncpy() 函数。在这里,整个数组被复制到指针中,因此我们可以简单地使用 strcpy() 函数。 - Bhuvanesh
@Bhuvanesh-你的观点是正确的,strcpy和strncpy都可以解决这个问题。但是strncpy会提供更多的控制,也就是说有时候strcpy会导致栈破坏(如果我们试图从源复制超过预期数据到目的地,则可能会发生这种情况)。 - sudhir
@sudhir 在这种情况下并不正确,因为输出缓冲区是使用malloc(strlen(str)+1)分配的。 因此,可以保证strcpy能够正常工作,而且不会溢出缓冲区。 如果正在使用固定大小的输出缓冲区,并且输入字符串的长度是未知的,则strncpy将是更好的选择。 - user3386109

1

你的第一段代码完美地复制了字符串,但在此过程中你移动了已分配的字符指针。如果要使其正常工作,需要将其初始值保存在某个临时指针中。

char str[] = "Hello World";
char *result = (char *)malloc(strlen(str)+1);
char *tmp = result;
int index=0;
while(index <= strlen(str))
{
  *result = str[index];
  result++;
  index++;
}
printf("%s\n", tmp);

1
在我看来,没有实际的理由修改指针(就像你在第一个片段中所做的那样),当你可以添加一个偏移量(就像你在第二个片段中所做的那样)。这只会使代码变得更难以正确编写。
对于第一个片段,请尝试像这样保存原始的result
char *result = ...
char *start = result;

在循环之后,尝试打印start,而不是result。它应该指向新复制的字符串,就像你期望的那样。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接