C中的指针,字符串问题

时间:2010-01-23 18:32:46

标签: c string pointers char

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

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

char foo[];

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

printf("%s", foo);

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

char *bar;

bar = &foo[0];

printf("%s", foo);

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

warning: initialization makes pointer from integer without a cast

希望这是足够的信息。感谢您的帮助。

3 个答案:

答案 0 :(得分:6)

您需要复制字符串。

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

char *bar = strdup(foo);

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

free(bar);

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

char copy[SOMESIZE];
strncpy(copy, foo, sizeof(copy) - 1);
copy[sizeof(copy) - 1] = '\0';    

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

char copy[strlen(foo) + 1];
strcpy(copy, foo);

正如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;
}

答案 1 :(得分:0)

您需要使用strncpy复制字符串,或使用strdup复制字符串:

char foo[] = "Hello World";
char* bar = strdup(foo);

foo[0] = 'B';
printf("%s", foo);
printf("%s", bar);

free(bar); // Don't forget to release the memory!

打印:

Bello World
Hello World

或者,如果您已经有要复制的字符串:

char foo[] = "Hello World";
char bar[] = "Goodbye Cruel World";

strncpy(bar, foo, sizeof(bar)-1); 

foo[0] = 'B';
printf("%s", foo);
printf("%s", bar);

也是rints:

Bello World
Hello World

strncpy的第三个参数是要复制的最大字符数(以防止溢出)请注意,它比bar缓冲区的长度小一个,以便bar可以被终止了。另请注意,sizeof仅适用于此处,因为bar是本地数组。它不适用于char*,在这种情况下,您需要知道外部的大小,例如:

char foo[] = "Hello World";
size_t bar_len = 20;
char* bar = (char*)malloc(bar_len);

strncpy(bar, foo, bar_len-1); // CANNOT use sizeof(bar) here!

foo[0] = 'B';
printf("%s", foo);
printf("%s", bar);

free(bar); // Don't forget!

答案 2 :(得分:-3)

使用strcpy函数将字符串复制到另一个变量。

char *myStringVar;

strcpy(myStringVar, your_Function_Returning_String() )

如果返回的字符串超出范围,则为myStringVar分配内存。

编辑:

char *myStringVar = (char *)malloc(BUFFER_SIZE);