0

入力の 80 文字の行を、各要素が文字列を指す配列に分割しようとしています。基本的に、「Hello world!」のように char a[80] を変換します。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 は、parse() での変数 commaray の動作を表示しません。代わりに、私は意味不明になります。どうしてこれなの?配列を渡すことは、デフォルトでは参照渡しだと思いましたか? Commarray の場合、文字列へのポインタの適切な配列を取得します (と思います)。引数については、使用できるものは何もありません。

4

1 に答える 1

1

ポインター地獄はあなたがいるところです。このコードには少なくとも 2 つの基本的な問題が見られますが、それ以上の問題がある可能性があります。

1) COMMARRAY へのすべての割り当てに単語を再利用します。したがって、commarray 内のすべてのポインターが同じ単語配列を指すことになります。明らかに、それは機能しません。

2) 解析関数を終了すると、単語配列はスコープ内になくなるため、無効なメモリになります。したがって、すべての args 配列ポインターが無効な (したがってガベージ) メモリの同じ部分を指しています。

私のアドバイスは、ポインターの使用をやめ、C++、つまり std::string クラスの使用を開始することです。これは、ポインターよりもはるかに論理的かつ直感的に動作します。

于 2013-03-28T23:59:06.363 に答える