-1
1.  vector<string> cmdv=explode(" ","i am a string");
2.  std::string arg;
3.  char * args[10];
4.  for (i = 0; i < cmdv.size(); i++) {
5.      arg = std::string(cmdv[i]);
6.      if (cmdv[i][0] == '"') {
7.          //do some thing
8.      }
9.      args[i] = arg.c_str();;
10. }
11. args[i]='\0';

args配列の内容を期待していまし{"i","am","a","string"}たが、args配列は{"am","a","string","string"}

デバッグ時に、if節の 6 行目で whencmdv[i][0]が と比較され'"'args[i-1]の内容に置き換えられていることがわかりましたarg。私は当惑しました!

機能には問題ありませんexplode。その動作は良好です。

4

1 に答える 1

2

これは問題です :-

args[i] = arg.c_str();

これによって返されるポインターは、arg にその値が含まれている間のみ有効であり、ループのたびに arg を変更します。文字列への C スタイルのポインターを保存する場合は、そのコピーを作成する必要があります。

args[i] = strdup(arg.c_str());

ただし、解放することを忘れないでください。さらに、とにかくCスタイルの文字列を使用するよりも、必要なものを達成するためのより良い方法がおそらくあります

于 2013-07-10T08:20:26.003 に答える