在C+中拆分字符串+;(使用strtok?)? 我对编码很陌生,在C++中尝试分割字符串时遇到了一些麻烦。我想知道如何分割一个字符串,它在C++中被输入为 const char的名称[](即“玛丽,Jun,简”)< /代码>,而不使用任何外部库(即我不想使用包含< /代码>等-虽然我可以使用包含< /代码>)。

在C+中拆分字符串+;(使用strtok?)? 我对编码很陌生,在C++中尝试分割字符串时遇到了一些麻烦。我想知道如何分割一个字符串,它在C++中被输入为 const char的名称[](即“玛丽,Jun,简”)< /代码>,而不使用任何外部库(即我不想使用包含< /代码>等-虽然我可以使用包含< /代码>)。,c++,arrays,string,char,C++,Arrays,String,Char,我试过使用: const char names[] = "Mary, Jan, Jane"; char *token = strtok(names, ","); while (token != NULL) { token = strtok(NULL, " "); } 但我似乎无法传入一个常量字符数组,我还想知道您将如何访问所有单独的“令牌” 此外,我还尝试将输入更改为仅为char names[](但我确实需要输入为const),但我得到了一个分段错误,我不明白原因。strtok修改输

我试过使用:

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

char *token = strtok(names, ",");
while (token != NULL) {
    token = strtok(NULL, " ");
}
但我似乎无法传入一个常量字符数组,我还想知道您将如何访问所有单独的“令牌”


此外,我还尝试将输入更改为仅为char names[](但我确实需要输入为const),但我得到了一个分段错误,我不明白原因。

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

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

如果你想看到一些(很多,实际上)在C++中分割字符串的方法,请看这个Q/A:


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

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

如果你想看到一些(很多,实际上)在C++中分割字符串的方法,请看这个Q/A:

使用而不是字符数组并利用类。将
分隔符传递给函数:

#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';
    }
}
使用而不是字符数组并利用类。将
分隔符传递给函数:

#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';
    }
}

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

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

它将要求您使用std::string和一个容器,如std::vector

你提到你不想使用

#include <string>
#包括
我想问:为什么不呢?如果你要用C++编程,熟悉STD::String和STL是必不可少的。

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

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

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

它将要求您使用std::string和一个容器,如std::vector

你提到你不想使用

#include <string>
#包括
我想问:为什么不呢?如果你要用C++编程,熟悉STD::String和STL是必不可少的。

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

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;
    }

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;
    }

strtok()
不接受常数作为参数。它实际上修改了传入的字符串。如何定义“外部库”?不使用任何外部库——那么,你认为“代码> Strtok())/代码>为什么?为什么不能使用“包含”?这是那种要求的家庭作业吗?如果是这样,我会怀疑我的教授的质量……我在尝试用C++来分割字符串时遇到了一些麻烦——也许最好把代码改成<代码> C<代码>,在StAdvExcel中的<代码> C++ <代码>组中进行询问,因为你想扔掉C++。它实际上修改了传入的字符串。如何定义“外部库”?不使用任何外部库——那么,你认为“代码> Strtok())/代码>为什么?为什么不能使用“包含”?这是那种要求的家庭作业吗?如果是这样,我会怀疑我的教授的质量……我在尝试用C++来分割字符串时遇到了一些麻烦——也许最好把代码改成<代码> C<代码>,在StAdvExcel中的<代码> C < /Cuff>组中询问,因为你想扔掉C++。还有别的选择吗?我不能使用图书馆。你有没有把它和strtok或boost::algorithm::split进行性能测试?如果有问题的代码要执行的话,这可能值得注意。有其他选择吗?我不能使用图书馆。你有没有把它和strtok或boost::algorithm::split进行性能测试?如果有问题的代码需要执行,那么可能值得注意。您会使用什么来代替?我添加了一个链接。您会使用什么来代替?我添加了一个链接。