2011-05-23 112 views

回答

9

std::ctype_base::spacestd::istream的分隔符,它使其停止從源讀取更多字符。

std::ctype_base::space引用空格和換行符。這意味着,當使用cin>>s進行閱讀時,s可以包含除空格和換行符之外的任何字符。

如果要讀取包含空格的完整行,則可以使用getline()函數,該函數使用換行符作爲分隔符。還有它的重載函數,如果你想提供你自己的分隔符,你可以使用它。 See it's documentation for further detail


您也可以使用自定義區域,你可以設置爲std::istream。您的自定義語言環境可以定義一組字符作爲分隔符std::istream。你可以在這裏看到一個這樣的例子(見我的解決方案):

Right way to split an std::string into a vector<string>

+0

我想我明白你的」試着說,但'std :: ctype_base :: space'是一個'enum',並且是一個掩碼值,它只能用作'std :: ctype <> :: is'的參數。而這又取決於所處的語言環境,原則上可以做任何事情。 – 2011-05-23 09:06:26

+0

@詹姆斯:嗯..我明白了。我的編輯版本(水平線之後)可能解釋更好? : -/ – Nawaz 2011-05-23 09:08:05

+1

是的,雖然我會考慮你所指的濫用解決方案。重要的事情要記住的是1)白色空間是分隔符,2)什麼被認爲是白色空間是語言環境依賴,在流中浸入的語言環境。 – 2011-05-23 10:51:45

3

分隔符是任何針對std::isspace(ch, std::sin.getlocale())返回true字符ch。換句話說,無論什麼 浸入式語言環境認爲「白色空間」。 (雖然我會 認爲這有點濫用,我知道程序員創建 特殊的語言環境,這考慮如,空白,並使用 >>讀取逗號分隔的列表。)

+0

我想我在這裏濫用它(是否真的濫用?):http://stackoverflow.com/questions/5607589/right-way-to-split-an-stdstring-into-a-vectorstring – Nawaz 2011-05-23 09:10:05

+0

我認爲它是。調用逗號空格是恕我直言的濫用,並且令人困惑。這也是危險的:被植入的區域被用於其他的東西,比如解析數字。 (想想如果你使用的是法語語言環境的結果,其中'',''也是小數點分隔符。)我通常更喜歡這個操作符。分隔符應該取決於語言環境。 (逗號是小數點時,分號通常用作分隔符。)但是我們確實需要一個單獨的條目。 (這是'std :: complex'的一個問題,'''操作符是不可用的。) – 2011-05-23 10:56:59

+0

@James:如何使用植入語言環境來解析數字?你能解釋一下嗎? – Nawaz 2011-05-23 11:01:59