C中的指针,字符串问题

Jus*_*ess 1 c string pointers char

我在第一次学习C++之后第一次使用C作为一个类项目,所以语法就是杀了我......基本上,我需要将函数给出的字符串存储到一个单独的变量中供以后使用.

我有一个像这样声明的字符数组

char foo[];
Run Code Online (Sandbox Code Playgroud)

我给出的一个函数将一堆字符分配给这个数组(或指向字符的指针?).我可以像这样打印出存储在foo中的实际字符串

printf("%s", foo);
Run Code Online (Sandbox Code Playgroud)

我可以将其地址存储在这样的不同变量中

char *bar;

bar = &foo[0];

printf("%s", foo);
Run Code Online (Sandbox Code Playgroud)

在这两种情况下,完整的字符串输出都很好.但是,如何将此字符串存储在另一个变量中?如果foo改变了,那么bar将不再保存我需要的字符串,因为它只是指向foo.我想到的任何东西都会给我编译错误

warning: initialization makes pointer from integer without a cast
Run Code Online (Sandbox Code Playgroud)

希望这是足够的信息.我在这里先向您的帮助表示感谢.

R S*_*hko 6

你需要复制字符串.

最简单的方法是使用堆分配:

char *bar = strdup(foo);
Run Code Online (Sandbox Code Playgroud)

完成后,不要忘记释放该分配:

free(bar);
Run Code Online (Sandbox Code Playgroud)

如果您不想使用堆分配,您可以在堆栈上创建一个缓冲区并手动将其复制.您确实要小心不要溢出缓冲区(并且缓冲区已终止,strncpy赢了如果你的src比你的目标更长,那就为你做这件事:

char copy[SOMESIZE];
strncpy(copy, foo, sizeof(copy) - 1);
copy[sizeof(copy) - 1] = '\0';    
Run Code Online (Sandbox Code Playgroud)

如果你有可变长度数组支持,你可以使用:

char copy[strlen(foo) + 1];
strcpy(copy, foo);
Run Code Online (Sandbox Code Playgroud)

正如Christoph在评论中正确指出的那样,strdup不是C标准的一部分.如果您使用的是Windows,则需要使用_strdup.如果你想要绝对便携,你可以很容易地实现strdup:

char *strdup(const char *orig)
{
    char *copy = (char *)malloc(strlen(orig) + 1);
    if (copy != NULL)
        strcpy(copy, orig);

    return copy;
}
Run Code Online (Sandbox Code Playgroud)