我在第一次学习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
希望这是足够的信息。感谢您的帮助。
答案 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);