将字符串复制到数组中

时间:2016-03-24 20:02:19

标签: c

我正在尝试将字符串的字符复制到动态数组中。以下是我正在使用的内容:

void foo(const char * string, char ** final)
{
    unsigned long n = strlen(string);
    final = (char **)malloc(n+1);
    for (int i = 0; i < n; ++i)
    {
        final[i] = string[i];  // error here
    }
}

构建失败并指向标记为&#34;此处出错的行。&#34;出现错误:

Incompatible integer to pointer conversion assigning to 'char *' from 'const char.'

我认为问题在于我创建数组/使指针正确。

2 个答案:

答案 0 :(得分:3)

假设final是您的输出参数,您需要取消引用它以分配malloc的结果,然后再次为循环中的赋值

*final = malloc(n+1);
for (int i = 0; i < n; ++i) {
    (*final)[i] = string[i];
}

再次假设您的预期用法类似于以下内容

input_str = "some text";
char* copy;
foo(input_str, &copy);

虽然问题为什么不让api返回副本?

char* copy = foo(input_str);

答案 1 :(得分:0)

如果通过引用传递NULL句柄(指向指针的指针),原始代码将无法正常工作。因此,在foo()中进行所有分配业务没有多大意义:如果foo()没有返回 final ,则它在foo外部不可用( )除非已经初始化,恕我直言。然后句柄有意义,foo()将第二个字符串的地址作为参数,而不必返回它。让我们考虑这个示例代码,基于原始帖子(包括调试打印):

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void foo(const char * string, char ** final)
{
(*final) = (char *)malloc(n+1);//we deference the address to reach and size the variable
printf("From foo:  ");
for (unsigned long i = 0; i < strlen(string); ++i)
{
    (*final)[i] = string[i];  
    printf("%c",(*final)[i]);
}
printf("\n");
}

为了简单起见,我们假设foo()以下列方式从另一个函数调用:

int main(int argc, const char * argv[])
{
char  *fin;
char  *str = "string";
foo(str, &fin);    
printf("From main: ");
for(unsigned long j = 0; j < strlen(fin); j++)
    printf("%c", fin[j]);
printf("\n");
return 0;
}

它会起作用,但是为了什么?恕我直言,有更简单的方法可以达到同样的效果。希望这可以提供帮助。