在C++中为变量赋值字符串的奇怪情况 1.vector cmdv=explode,我是一个字符串; 2.std::字符串arg; 3.char*args[10]; 4.对于i=0;i

在C++中为变量赋值字符串的奇怪情况 1.vector cmdv=explode,我是一个字符串; 2.std::字符串arg; 3.char*args[10]; 4.对于i=0;i,c++,string,C++,String,我希望args数组的内容是{I,am,a,string},但是args数组是{am,a,string,string} 在调试时,我发现在将cmdv[i][0]与“”进行比较时,在if子句的第6行,args[i-1]被替换为arg的内容。我被搞糊涂了 “爆炸”功能没有问题。工作正常。这是一个问题:- args[i] = arg.c_str(); 此返回的指针只有在arg包含其值并且每次通过循环都更改arg时才有效。如果要存储指向该字符串的C样式指针,则需要对其进行复制,例如:- args[i]

我希望args数组的内容是{I,am,a,string},但是args数组是{am,a,string,string}

在调试时,我发现在将cmdv[i][0]与“”进行比较时,在if子句的第6行,args[i-1]被替换为arg的内容。我被搞糊涂了

“爆炸”功能没有问题。工作正常。

这是一个问题:-

args[i] = arg.c_str();
此返回的指针只有在arg包含其值并且每次通过循环都更改arg时才有效。如果要存储指向该字符串的C样式指针,则需要对其进行复制,例如:-

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

但请记住释放它。另外,可能有一种更好的方法可以实现您想要的,而不是使用C样式的字符串

我不明白比较操作是如何影响args数组的内容的。此时使用cmdv进行的任何比较操作都会更改参数[i-1],我不明白为什么这值得进行下一票,只是它可能比这里更适合stackoverflow。请将其移植到stackoverflowthen@JohnB我知道变量的作用域在那个点结束。但它似乎起了作用。我仍然对内容在比较时的变化感到困惑,而不是在给arg分配新字符串时?我没有使用strdup,但我使用了args[i]=stringarg.c_str.c_str它不起作用。Y我正在分配一个新的c类型字符串r8?您正在那里创建一个临时字符串对象,然后使用c_str获取一个指向其中存储的数据的指针。当临时字符串被销毁时,它指向的数据将在行尾被销毁。因为数据可能仍在内存位置,所以它可能会工作。一定程度上有时直到那个记忆被重新利用。哦!thanq:D我知道变量的作用域在那个点结束。但它似乎起了作用。我仍然对比较时的内容变化感到困惑,而不是在为arg分配新字符串时?@neckTwi:编译器优化。你不能早一点注意到这一点。调试器不起作用。