2017-01-01 64 views
0

我想從包含幾行的字符串中讀取數據作爲標記。 我使用的代碼strtok如何處理換行符?

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' 作爲分隔符?

+1

爲什麼不編譯和檢查? – kabanus

+5

在常量'c_str()'return上使用'strtok'並不是一個好主意(強制非const轉換,骯髒的黑客!!)。你應該看看真正的方法來根據_real_ C++中的分隔符來分割文本。 –

+1

是的,使用'\ n'作爲分隔符是合法的。這是一個像其他人一樣的角色。但請注意,您只在第一個'strtok'調用中通過'\ n'作爲分隔符,而不是在任何後續調用中。這就是爲什麼'1 \ n0''結束爲一個單一的標記 - 不是因爲'\ n'在某種程度上是特殊的,而是因爲你不把它當作任何標記的分隔符,而是作爲第一個。 –

回答

1

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