Strtok如何处理新线

How strtok handles newlines?

本文关键字:处理 新线 何处理 Strtok      更新时间:2023-10-16

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

    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,1n"
"0,44248,8,45040,20,1,0,100n"
"545,590,603,564,566,598,569,585,586,578n";

,输出为

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,因此不应该更改。

另外,即使这可以起作用,您也没有在随后的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; 
}