c++ - strtok 如何处理换行符?

标签 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, " ,.-");
    }

输入是

std::string SP1271 = "1271,1\n"
"0,44248,8,45040,20,1,0,100\n"
"545,590,603,564,566,598,569,585,586,578\n";

输出是

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

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

最佳答案

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

此外,即使这可行,您也没有预见到“\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; 
}

关于c++ - strtok 如何处理换行符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41417737/

相关文章:

c++ - set.upper_bound()和upper_bound(set.begin(),set.end())STL之间的区别

C++ 视频流检测 FPS

c - 连接字符串和数字的最佳方式是什么 - 使用 C 的性能?

c - 将字符串解析为单独的元素

powershell - 如何在PowerShell中处理动态长度的子字符串

C++ 关于给 Vector<Point> myVariable 赋值

c++ - 通过引用方法传递对象

python - 为什么它不让我删除这个字符串或打包它 python

C++:没有 <cstring> 的字符串函数

python - 如何使 pyparsing 语法依赖于实例属性?