-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]));
}

我在令牌数组中有以下值。

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[] 中获得这些值。我不知道为什么会这样。

4

3 回答 3

3

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

其次,复制以零结尾的字符串实际上是strcpy函数的作用。你为什么选择memcpy改用?

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

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

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

这种方法是否适用于您的情况取决于您要做什么。

于 2012-12-20T02:19:06.220 回答
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 字符)

于 2012-12-20T02:10:17.070 回答
1

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

for (i = 0; i < n; i++) {
    strcat(token[i+4], temp_store[i]);
}

如果要进行字符串操作,请使用以空字符结尾的字符串和 str* 函数。C 支持这些,并且您想要的许多字符串操作(连接、长度、分配的复制、比较)都在套件中,而且它们比 mem* 函数使用起来更方便。

于 2012-12-20T02:16:57.597 回答