我正在尝试将输入的80个字符的行分割成一个数组,其中每个元素都指向一个字符串。本质上,将字符变成[80],例如“ Hello world!”。变成char * b [64],其中b [0]指向“ Hello”,b [1]指向“ world!”。

基本上,strsep()将允许我使用以下代码:

while((cmd->argv[argc++] = strsep(clPtr, WHITESPACE)) != NULL);


我想知道如何修改此代码:

int parse(char* comm, char** commarray) {
  int count = 0;
  char word[80] = "";
  char ch[2] = {' ', '\0'};

  if(strlen(comm) == 0) {
    commarray[0] = "NULL";
    return 0;
  }

  for(size_t i = 0; i < strlen(comm); i++) {
    int c = int(comm[i]);
    if(!isspace(c)) {
      ch[0] = comm[i];
      strcat(word, ch);
      if(i == (strlen(comm) - 1)) {
        commarray[count] = word;
        cout << commarray[count] << endl;
        count++;
      }
    }
    else if(isspace(c) && word != "") {
      commarray[count] = word;
      cout << commarray[count] << endl;
      word[0] = '\0';
      count++;
    }
  }

 return 1;
}

//main
int main() {
  char command[80];
  char* args[64];

  while(true) {
    cout << "order>";
    cin.getline(command, 80);

    if(strcmp(command, "quit") == 0 || strcmp(command, "exit") == 0) {
      break;
    }

    parse(command, args);

    cout << args[0] << endl;

    if(strcmp(args[0], "quit") == 0 || strcmp(args[0], "exit") == 0) {
      break;
    }

    /*for(int i = 0; i < 3; i++) {
        cout << args[i] << endl;
    }*/
  }
  return 0;
}


main()中的变量args不会显示commarray变量在parse()中的作用。相反,我变得胡言乱语。为什么是这样?我以为通过数组默认是通过引用传递?对于commarray,我得到了指向字符串的指针的适当数组(我认为)。对于参数,我什么都没用。

最佳答案

指针地狱就是你所在的地方。我可以看到至少两个基本的代码问题,但可能还有更多的问题。

1)您将单词重用于commarray的所有分配。因此,您最终将commarray中的所有指针指向同一单词数组。显然这行不通。

2)退出解析功能后,单词数组不再在作用域内,因此它将成为无效内存。因此,您所有的args数组指针都指向同一块无效(因此是垃圾)内存。

我的建议是,停止使用指针,开始使用C ++,即std :: string类,它将比任何指针在逻辑和直观上都表现得更好。

关于c++ - 将char分成char指针数组,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15694124/

10-16 17:38
查看更多