C++ strtok是如何处理新线的?

C++ strtok是如何处理新线的?,c++,string,string-parsing,C++,String,String Parsing,我试图从包含几行的字符串中读取数据作为标记。 我使用代码 char * pch; pch = strtok ((char*)MyStr.c_str()," ,|,\n"); int i = 0; while (pch != NULL && i++ < 10) { cerr << i << ':' << pch << ' '; pch = strtok (NULL, " ,

我试图从包含几行的字符串中读取数据作为标记。 我使用代码

    char * pch;
    pch = strtok ((char*)MyStr.c_str()," ,|,\n"); int i = 0;
    while (pch != NULL && i++ < 10)
    {
      cerr << i << ':' << pch << ' ';
      pch = strtok (NULL, " ,.-");
    }
输出是

1:1271 2:1
0 3:44248 4:8 5:45040 6:20 7:1 8:0 9:100
545 10:590 

使用“\n”作为分隔符合法吗?

使用
strtok()
是一个非常糟糕的主意,因为此函数可能会更改原始字符串,而原始字符串不应更改,因为它是
常量

而且,即使这样做可行,您也没有预见到“\n”将作为后续
strtok()
循环中的令牌分隔符。所以最好对齐所有标记分隔符字符串

为什么不使用C++函数:

size_t pe;
for (size_t pb=0; pe=MyStr.find_first_of(" ,-\n", pb); pb=pe+1)
{
    cout  << MyStr.substr(pb, (pe==string::npos ? pe:pe-pb))<< " ";
    if (pe==string::npos)
        break; 
}
size\t pe;
对于(大小pb=0;pe=MyStr.find_first_of(“,-\n”,pb);pb=pe+1)
{

为什么不编译和检查呢?在常量
c_str()
return上使用
strtok
不是一个好主意(使用强制非常量转换,肮脏的hack!!)你应该看看一个真正的方法来分割文本根据实际的C++中的分隔符。是的,合法的使用<代码> \n>代码>作为分隔符。它是一个与任何其他字符一样的字符。注意,你只在第一个代码> Sttok\<代码>调用中作为一个分隔符而通过代码> > \n>代码>,但是在任何后续调用中都没有。这就是为什么代码> 1“n0”。
最终成为一个单独的标记-不是因为
\n
在某种程度上是特殊的,而是因为除了第一个标记外,您没有将它视为任何标记的分隔符。最好使用
std::string
方法来解析文本。
strok
函数修改传递给它的C样式字符数组。“(char*)MyStr C_str()你在做什么?
size_t pe;
for (size_t pb=0; pe=MyStr.find_first_of(" ,-\n", pb); pb=pe+1)
{
    cout  << MyStr.substr(pb, (pe==string::npos ? pe:pe-pb))<< " ";
    if (pe==string::npos)
        break; 
}