Memcpy覆盖三维数组中的区域

问题描述 投票:0回答:1

我试图做一个小bash并将字符串解析为3维数组。第一个索引是cmd,第二个是参数,第三个是字符。

不,我的问题是,当我记忆最后一个参数时,它会将它写入下一个命令。

int main()
{
  char buffer[256] = {"c1 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 \n"}; 
  char arg_list[10][10][255];
//  fgets(buffer, 255, stdin);

  int c = 0;
  int index_cmd = 0;
  int index = 0;
  int index_arg = 1;
  int lastIndex = 0;
  int nxt_cmd = 0;

  for(c = 0; c < 255; c++)
  {
    if (buffer[c] == '\r' || buffer[c] == '\n' || buffer[c] == ' ')
    {
      if(index_cmd == 0 || nxt_cmd)
      {
        memcpy(arg_list[index_cmd][0], buffer + lastIndex, c - lastIndex);
        arg_list[index_cmd][0][c-lastIndex] = 0;
        index_cmd++;
        index_arg = 1;
        nxt_cmd = 0;
      }
      else if(buffer[c-1] == '&' || buffer[c-1] == '|')
      {
        memcpy(arg_list[index_cmd][0], buffer + lastIndex, c - lastIndex);
        arg_list[index_cmd][0][c-lastIndex] = 0;
        nxt_cmd = 1;
        index_cmd++;
        index_arg = 1;
      }
      else if(buffer[c-1] != ' ' && buffer[c+1] != ' ')
      {
        memcpy(arg_list[index_cmd-1][index_arg] , buffer + lastIndex, c - lastIndex);
        arg_list[index_cmd-1][index_arg][c-lastIndex] = 0;
        index_arg++;
      }
      lastIndex = c +1;
    }

  }

  int i,j,k = 0;
  for(i = 0; i < 4; i++)
  {
    for(j =1; j < 11; j++)
    {
        printf("command %d %s\n",i,arg_list[i][0]);
        printf("arg %d %s\n",j, arg_list[i][j]);
    }
  }
}

代码示例给出了以下输出:

command 0 c1 
arg 1 a1
command 0 c1
arg 2 a2
command 0 c1
arg 3 a3
command 0 c1
arg 4 a4
command 0 c1
arg 5 a5
command 0 c1
arg 6 a6
command 0 c1
arg 7 a7
command 0 c1
arg 8 a8
command 0 c1
arg 9 a9
command 0 c1
arg 10 a10
command 1 a10
arg 1 
command 1 a10
arg 2 
command 1 a10
arg 3 
command 1 a10
arg 4 
command 1 a10
arg 5 
command 1 a10
arg 6 
command 1 a10
arg 7 
command 1 a10
arg 8 
command 1 a10
arg 9 
command 1 a10

因此它将argument10写入数组中的位置,如果提供,则应该是下一个命令。

我真的不知道这个问题是什么,但我认为它与memcpy有关。

我感谢任何帮助:)

c multidimensional-array memcpy
1个回答
2
投票

在C中,数组的索引是0 ...(数组-1中的元素数)。所以关于:索引到

char arg_list[10][10][255];

第一个索引的范围是0 ... 9

第二个索引的范围是0 ... 9

第三个索引的范围是0 ... 254。

已发布代码中在允许范围之外编制索引的那些区域是错误的,并导致未定义的行为

© www.soinside.com 2019 - 2024. All rights reserved.