C指针数组不能与memcpy一起使用
我想用memcpy连接两个字符串。但下一个memcpy不起作用。我的预期输出是“我的名字是汗”C指针数组不能与memcpy一起使用,c,array-pointer,C,Array Pointer,我想用memcpy连接两个字符串。但下一个memcpy不起作用。我的预期输出是“我的名字是汗” #包括 #包括 #包括 int main() { char*var1=“我的名字”; char*var2=“is khan”; char*f_add[20]; memcpy(f_add,var1,strlen(var1)+1); memcpy(f_add+8,var2,strlen(var2)+1); printf(“%s”,f_add); 返回0; } 指针数组仅保存字符串文本的地址(引用)。你的代
#包括
#包括
#包括
int main()
{
char*var1=“我的名字”;
char*var2=“is khan”;
char*f_add[20];
memcpy(f_add,var1,strlen(var1)+1);
memcpy(f_add+8,var2,strlen(var2)+1);
printf(“%s”,f_add);
返回0;
}
指针数组仅保存字符串文本的地址(引用)。你的代码毫无意义
int main(void)
{
char *var1 = "my name";
char *var2= "is khan";
char *f_add[20];
f_add[0] = var1;
f_add[1] = var2;
printf("%s\n%s", f_add[0], f_add[1]);
return 0;
}
或者您需要为字符串分配空间
int main(void)
{
char *var1 = "my name";
char *var2= "is khan";
char *f_add[20];
f_add[0] = malloc(strlen(var1) + 1);
f_add[1] = malloc(strlen(var2) + 1);
memcpy(f_add[0],var1, strlen(var1)+1);
memcpy(f_add[1],var2, strlen(var2)+1);
printf("%s\n%s", f_add[0], f_add[1]);
return 0;
}
C语言或多或少是一种低级语言,因此您必须自己操作内存 例如:
char *var1 = strdup("my name");
char *var2 = strdup(" is kahn");
memcpy(&var1[7],var2, strlen(var2)+1);
strdup是一个C函数,用于自动将指针malloc为给定字符串的大小。
然后将字符串复制到指针中
一旦它们都是malloced(或者至少是var1),您就可以使用memcpy将它们连接在一行中。
char*f_add[20]
定义一个包含两个指向char
的指针的数组。您可能需要一个包含20个字符的简单数组:
char f_add[20];
然后你需要复制到正确的地方。复制到f_add+8开始在标记第一个字符串结尾的空字节后写入,因为该字符串“my name”有七个非空字符和一个空终止符。因此,您需要在空字符上开始复制:
memcpy(f_add+7, var2, strlen(var2)+1);
您还可以使用
memcpy(f_add+strlen(f_add),var2,strlen(var2)+1)
,尽管这实际上是strcpy(f_add,var2)所做的。指针需要内存使用malloc
,用于f_add
和char*f_add[20]
不是进行连接的正确方法为什么memcpy
而不是strcpy
&strcat
<代码>strcpy(f_add,var1);strcat(f_add,var2)代码>(并正确定义f_add
)。PS:你的问题(其中之一)是+8
-你需要+7
,因为8超过了零,即第二个字符串被忽略。我猜他们的意思是char f_add[20]
,把它变成一个指针数组是偶然的,或者是一个误解。你的例子是写过分配字符串的末尾(var1),它是8号的。您可能希望将大小为strlen(var1)+strlen(var2)+1
的对象作为目标。此代码错误地访问内存。您已将一个8字节的字符串分配到var1中,并尝试使用memcpy将其写入过去。不好:)你的解释是正确的,很有帮助。谢谢
memcpy(f_add+7, var2, strlen(var2)+1);