【问题标题】:Splitting a string in C++ (using strtok?) separated by a comma deliminator and using no external libraries?用逗号分隔符分隔 C++ 中的字符串(使用 strtok?)并且不使用外部库?
【发布时间】:2017-10-26 20:05:46
【问题描述】:

我真的是编码新手,尝试在 C++ 中拆分字符串时遇到了一些麻烦。我想知道如何拆分一个字符串,该字符串在 C++ 中作为 const char names[] (i.e. "Mary, Jan, Jane") 输入而不使用任何外部库(即我不想使用 #include <string> 等 - 虽然我可以使用 @987654323 @)。

我尝试过使用:

const char names[] = "Mary, Jan, Jane";

char *token = strtok(names, ",");
while (token != NULL) {
    token = strtok(NULL, " ");
}

但我似乎无法传递一个 const 字符数组,而且我还想知道您将如何访问所有单独的“令牌”?

另外,我尝试将输入更改为 char names[](但我确实需要输入为 const),但出现分段错误,我不明白为什么。

【问题讨论】:

  • strtok() 不使用常量作为参数。它实际上修改了传入的字符串。
  • 如何定义“外部库”?
  • 不使用任何外部库 -- 那么strtok()你怎么看?
  • 为什么不能使用#include ?这是某种具有该要求的家庭作业吗?如果是这样,我会质疑我教授的素质......
  • 我在尝试在 C++ 中拆分字符串时遇到了一些麻烦 -- 将代码更改为 C 并在 @987654329 中询问可能会更好@group on StackOverflow,因为你想扔掉 C++。

标签: c++ arrays string char


【解决方案1】:

使用std::string 代替char 数组并使用std::stringstream 类。将, 分隔符传递给std::getline 函数:

#include <iostream>
#include <string>
#include <sstream>

int main() {
    std::string names = "Mary, Jan, Jane";
    std::string temp;
    std::istringstream ss(names);
    while (std::getline(ss, temp, ',')) {
        std::cout << temp << '\n';
    }
}

唯一剩下的就是处理每个字符串中的前导空格字符:

if (temp.front() == ' ') {
    temp.erase(0, 1);
}

【讨论】:

  • 还有其他选择吗?我不能使用
  • 您是否通过与 strtok 或 boost::algorithm::split 相比的性能测试来运行它?可能值得注意的是,如果有问题的代码是高性能的。
【解决方案2】:

strtok()的正确用法如下:

int main ()
    {
      char str[] ="Mary, Jan, Jane";
      char * pch;
      pch = strtok (str," ,");
      while (pch != NULL)
      {
        printf ("%s\n",pch);
        pch = strtok (NULL, " , ");
      }
      return 0;
    }

【讨论】:

    【解决方案3】:

    strtok 修改输入字符串。字符串作为char* 传递,而不是const char*。它将分隔符替换为'\0'。这使得它与字符串文字(const char*)不兼容。

    我永远不会使用这个函数,因为它还维护一个内部状态,这使得它无法在多个线程中使用,甚至在您处于使用 strtok 的函数中时调用也使用 strtok 的其他函数。

    如果您想了解一些(实际上是很多)在 C++ 中拆分字符串的方法,请查看此 Q/A:
    The most elegant way to iterate the words of a string

    【讨论】:

    • 你会用什么来代替?
    • 我添加了一个链接。
    【解决方案4】:

    我的首选方法是使用 boost::algorithm::split

    http://www.boost.org/doc/libs/1_63_0/doc/html/string_algo/usage.html#idp11326066

    它比 strtok 更安全,它是一个需要 c 字符串的 C 函数。

    这将要求您使用 std::string 和 std::vector 等容器。

    你提到你不想使用

    #include <string>
    

    我会问:为什么不呢?如果您打算使用 C++ 进行编程,熟悉 std::string 和 STL 将是必不可少的。

    如果您是编码新手,您可能还不熟悉 boost,但它是 C++ 中最常用的库之一。事实上,标准中的很多内容都来自于 boost。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多