所以,我正在尝试编写一个将返回 vector<char**>
的函数,因此:
vector<char**> test(string mystr) {
char*temp=new char[mystr.size()+1];
strcpy(temp,mystr.c_str());
char*subStr=strtok(temp,":");
while(subStr!=NULL) {
int i=0;
char**args=new char*[200];
char*tempsta=newchar[strlen(subStr)+1];
strcpy(tempsta, subStr);
args[i]=strtok(tempsta," ");
while(args[i]!=NULL) {
i++;
args[i]=strtok(NULL," ");
}
fullVec.push_back(args);
//cout<<subStr<<endl;
subStr=strtok(NULL,":");
}
return fullVec;
}
所以我想split
参数字符串为 ":"
定界符,然后用“”定界符。关于cout<<subStr
如果我注释掉 int i=0
中的所有内容,我会得到预期的结果至 fullVec.push_back(args)
.如果我不注释掉所有这些行,我只会得到第一行 substring
(直到遇到第一个“:”),然后退出最大的 while 循环。
我指的是期望值;让我们假设参数是“我的名字是:bon jovi:xxx ab” 如果所有内容都被注释掉,将打印以下行:
my name is
bon jovi
xxx ab
如果我保持原样,将会发生的只是
my name is
将打印,大循环将退出
感谢任何帮助,谢谢! (是的,我知道这似乎是一个愚蠢的练习,可以更优雅/更轻松地完成......但是我希望在使用字符串等娱乐之前让这个解决方案起作用。)
最佳答案
你的问题是 strtok() 在调用之间保持状态。
如果第一个参数不为 NULL,则它使用重置状态,否则它使用它保存的状态从它停止的地方继续解析。
因为您有两个对 strtok() 的嵌套调用,所以第二个调用扰乱了外部调用的状态。
这个调用:
args[i]=strtok(tempsta," ");
正在重置 strtok() 的内部状态。现在,它不再从您的外部调用中了解有关状态的任何信息。因此,当您到达内部循环中的字符串末尾时。
这个调用:
subStr=strtok(NULL,":");
现在正在使用内部循环的保存状态。所以它基本上只是终止,因为您已经到达该标记化流的末尾。
关于时间:2019-03-08 标签:c++char*parsing,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14912903/