使用 memcpy 复制字符串时遇到问题

Trouble copying the string using memcpy

我有一个字符串 toioyhpknmtlghk。我想创建一个具有 n 行的二维字符数组,它包含第一个、第二个、第三个子字符串,长度为 n。

比如这里n=5长度为5的子串是,toioyhpknmtlghk 所以数组 arr 应该看起来像

t o i o y
h p k n m
t l g h k

现在,如果我通过遍历数组来复制字符,这可能会更容易,但在这里我尝试使用 memcpy 作为,

int main()
{
  long n;
  cin>>n;
  char a[3][n+1];char str[20];   //I have taken n+1 columns as n for substring and 1 for '[=11=]'
  scanf("%s",str);
  char *p=str;
  memcpy(a[0],p,n);strcat(a[0],"[=11=]");
  p=p+n;
  memcpy(a[1],p,n);strcat(a[1],"[=11=]");
  p=p+n;
  memcpy(a[2],p,n);strcat(a[2],"[=11=]");

  for(int i=0;i<3;i++)
  {
    printf("%s\n",a[i]);
  }

}

但是在输出数组时得到以下结果,

//input
5
toioyhpknmtlghk

//output    
toioy
hpknm{tlghk‼â
tlghk‼â

命令 strcat(a[0],"[=11=]"); 正在处理已被 [=12=] 终止的字符串。否则它不知道 where 附加第二个字符串。在您的情况下 a[0] 未终止,因此该函数将引发未定义的行为。您可以改为执行以下操作:

a[0][n] = '[=10=]';

(其余a个元素相同)