2014-01-25 69 views
1

從文件讀取時遇到問題。這裏是一些示例代碼:在C++中打印引號不在整個std :: string中給出負的ASCII值?

std::for_each(vec.begin(), vec.end(), [&](std::string str1) { 

    //... split the string up by spaces into vector "split" 

    for (auto& str : split) { 
     std::cout << str << "\n"; 
     std::cout << str[0] << "\n"; 
    } 
}); 

所以基本上我打印出每一個元素分成一行,然後打印第一個字符。我所得到的是這樣的:

「test test test 
? 

,其中第一行是整個str,第二行應該是第一個字符。但是,它會打印一個?

for (auto& str : split) { 
     std::cout << str << "\n"; 
     std::cout << std::string(1, str[0]) << "\n"; 
} 

我用clang++ -std=c++11爲我的設置:即使使用std::string會給出相同的結果。有沒有人看過這個?

+0

對於我使用所有字符串的文件,保證不爲空。 – user473973

+0

@remyabel它基本上是所選擇的這個問題的答案:https://stackoverflow.com/questions/236129/how-to-split-a-string-in-c – user473973

回答

5

你的字符串可能不是編碼一個元素=>一個字符。我能夠重現您的問題here,它看起來像特殊引號取前三串個字節,因此這將正確打印:

std::cout << s.substr(0, 3); 

你的情況可能會有些不同,但我猜你和Coliru都是UTF-8。具體來說,該字符看起來是this one,即「左雙引號」,UTF-8值爲0xE2809C。

+0

謝謝!有沒有辦法得到它,這樣我可以檢查是否'字符ç==「\「」;' – user473973

+1

@ user473973,如果你想有一個標準的」'',你用在你的代碼字符串文字相同,我可能會去做一些正常化的功能(或者我可能是無知的,而且沒有人會用引號)。如果是這種情況,並且您知道您獲得了UTF-8,則可以自己查看位模式以找到該字符並將其轉換。不過,我不認爲你應該*有*做到這一點。 – chris

+0

應該指出,這不是解決這個問題的一般方法。事實上,它是「快速入侵」,使第二個語句std :: cout << str [0] <<「\ n」;'在特殊情況下工作。例如,如果第一個字符不同並且不是3個字節的UTF-8字符,則此黑客將不再工作。 – CouchDeveloper