我正在尝试做一个简单的memcpy,如下所示。
char *token[32];
char *temp_store[4];
for (i = 0 ; i < 4; i++)
{
memcpy(token[4+i],temp_store[i],strlen(temp_store[i]));
}
我在令牌数组中有以下值。
temp_store[0] = "5";
temp_store[1] = "6";
temp_store[2] = "7";
temp_store[3] = "8";
我希望将这4个值"5" , "6", "7", "8"
分别复制到token[4],token[5],token[6] and token[7]
。
但是由于某种原因,我没有在token []中获取这些值。我无法弄清楚为什么会这样。
答案 0 :(得分:3)
首先,如果要使用memcpy
函数复制C字符串,则必须复制strlen() + 1
个字节以包含零终止符。或者您必须自己添加终止零到目标阵列。没有终止零,它不是一个字符串。
其次,复制零终止字符串实际上是strcpy
函数的作用。为什么选择使用memcpy
?
第三,如果你真的想复制源字符串,你还记得在执行复制之前分配目标内存吗?告诉我们你如何分配它。到目前为止您发布的代码没有分配该内存,这意味着您的memcpy
调用将数据“复制到了无处”,导致未定义的行为通常会导致崩溃。
第四,您确定要复制这些字符串,而不是简单地将token[]
元素指向相同的内存位置吗?后者可以通过简单的
token[4+i] = temp_store[i];
这种方法是否适用于您的情况取决于您要做的事情。
答案 1 :(得分:2)
temp_store [0],temp_store [1],temp_store [2],temp_store [3]中的每一个都是一个指向char数组的指针。 您需要确保这四个char数组是空的。
strlen()用于确定空结束字符串的长度
将多个数组内容放入更大数组的另一种方法是使用memcpy,如下所示:
#include <stdio.h>
#include <string.h>
int main()
{
const int LEN = 10 ;
const int NUM_STRING = 4 ;
char token[NUM_STRING*LEN+1]={0};
char temp_store[NUM_STRING][LEN] = { {0} };
for (int i = 0 ; i < NUM_STRING; i++) {
memcpy(token+LEN*i, temp_store[i], sizeof(temp_store[i]));
}
return 0;
}
这会将整个temp_store [0],temp_store [1],temp_store [2],temp_store [3]复制到令牌
(这意味着temp_store [4] [10]中的所有10 * 4个字符)
答案 2 :(得分:1)
我不确定你要做什么。但是,如果你只是想连接一个字符串,memcpy就不是了。使用strcat,如下所示:
for (i = 0; i < n; i++) {
strcat(token[i+4], temp_store[i]);
}
如果要进行字符串操作,请使用空终止字符串和str *函数。 C支持这些,你需要的许多字符串操作(连接,长度,重复和分配,比较)都在套件中,而且使用它们比mem *函数更简单。