2011-05-23 86 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