简单memcpy不';好像不行

简单memcpy不';好像不行,c,pointers,memory,memcpy,C,Pointers,Memory,Memcpy,我试着做一个简单的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])); } 我希望将这4个值分别复制到令牌[4]、令牌[5]、令牌[6]和令牌[7] 但是,由于某种原因,我没有在令牌[]中获取这些值。我不明白这是为什么。这里,临时存储[0]、临时存储[1]、临时存储[2]

我试着做一个简单的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]));
}
我希望将这4个值分别复制到
令牌[4]、令牌[5]、令牌[6]和令牌[7]


但是,由于某种原因,我没有在令牌[]中获取这些值。我不明白这是为什么。

这里,临时存储[0]、临时存储[1]、临时存储[2]、临时存储[3]都是指向字符数组的指针。 您需要确保这四个字符数组以null结尾

strlen()用于确定以null结尾的字符串的长度

将多个数组的内容转换为更大数组的另一种方法是使用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;
}
#包括
#包括
int main()
{
常数int LEN=10;
const int NUM_STRING=4;
字符标记[NUM_STRING*LEN+1]={0};
字符临时存储[NUM_STRING][LEN]={{0};
for(int i=0;i
这会将整个临时存储[0]、临时存储[1]、临时存储[2]、临时存储[3]复制到令牌中


(这意味着temp_store[4][10]中的所有10*4个字符。)

我不确定您想做什么。但是,如果您只是想连接一个字符串,那么memcpy就不是一个好办法。使用strcat,如下所示:

for (i = 0; i < n; i++) {
    strcat(token[i+4], temp_store[i]);
}
(i=0;i{ strcat(令牌[i+4],临时存储[i]); }
如果要执行字符串操作,请使用以null结尾的字符串和str*函数。C支持这些操作,您需要的许多字符串操作(串联、长度、分配复制、比较)都在套件中,而且它们使用起来比mem*函数要简单。

首先,如果您想使用
memcpy
函数复制C字符串,您必须复制
strlen()+1
字节,包括零终止符字符。或者您必须自己将终止零添加到目标阵列。如果没有终止零,则它不是字符串

其次,复制零终止字符串实际上就是strcpy函数所做的。为什么选择使用
memcpy

第三,如果您真的想复制源字符串,您是否记得在执行复制之前分配目标内存?告诉我们你是如何分配的。到目前为止,您发布的代码没有分配内存,这意味着您的
memcpy
调用将数据复制到“无处”,导致未定义的行为,通常会导致崩溃

第四,您确定要复制这些字符串,而不是简单地使
token[]
元素指向相同的内存位置吗?后者可以通过简单的方法实现

token[4+i] = temp_store[i];

这种方法是否适用于您的情况取决于您正在尝试做什么。

temp\u store[i]
C字符串吗?对于您正在做的事情,我建议使用strcat。另外,你确认临时商店没问题吗?你是如何初始化它的?首先可能有问题。
token[4+i]
temp\u store[i]
未初始化。另外,“不起作用”不是一个问题描述。另外,我想知道OP到底想做什么。标记声明后的索引看起来非常可疑。Well不起作用意味着标记[]内的值与复制前的值相同。我明白你的观点。数组不是以null结尾的。如何在不使用strlen()的情况下计算长度。是否有其他函数计算大小?@liv2hak:如果使用字符串,使用以null结尾的。C功能旨在支持这些功能;为什么让你的生活更艰难?你是说strcat(代币[4+i],临时商店[i]);我的令牌中已经有4个字符串。我不希望它们被覆盖。好吧,上面的内容只是一个示例,但我对它进行了编辑以反映您的需要:)@AndryT:我认为复制意味着连接。
token[4+i] = temp_store[i];