时间:2019-03-08 标签:c++char*parsing

标签 c++ arrays vector char

所以,我正在尝试编写一个将返回 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/

相关文章:

c++ - 在 header 中实现的隐式内联虚函数

c++ - Getline 代码无法正常工作或我的代码无法正确编译

php - 在数组中搜索值匹配并替换值 - php

python - 提高数组处理的性能

c++ - 访问指针 vector ?

c++ - 打印一个 map 的值,它有两个字符串作为键和 vector 作为值

c++ - 如何 std::find 使用比较对象?

c++ - 为什么使用 `std::reverse_iterator` 不调用 UB?

c++ - 有人可以为我得到的输出清除这个概念吗?

java - 如何在运行时创建对象?