每次我快速编写一段C ++代码行
std::string s;
cin >> s;
我诅咒自己,因为我忘了它停在空白处而不是整条线。
然后,在记住getline
时,我总是对这两个品种感到困惑:
std::string s;
getline (std::cin, s);
和
char cs[256];
std::cin.getline (cs, sizeof (cs));
除了数据类型之外,这两者之间是否存在差异?
在我看来,C ++方式应该是前者。在什么情况下我会使用后者,因为我可能应该使用真正的字符串 无论如何都是以null结尾的字符数组?
而且,由于输入应该是输入流的范围,为什么不是istream
的前一部分?
答案 0 :(得分:23)
全局getline()函数适用于C ++ std::string个对象。
istream::getline()方法适用于“经典”C字符串(指向char
的指针)。
答案 1 :(得分:10)
请记住,标准库由3个(主要)部分组成:IOStream,String和STL,以及一些好东西和C-header。
我没有看到任何奇怪的部分松散耦合(虽然我希望情况并非如此)。
其他不一致包括:std::string::length
vs std::string::size
,后者已添加用于与STL的接口兼容性,前者已保留以与旧代码兼容。
答案 2 :(得分:7)
这是一个常见的界面设计问题。 cin.getline()
是发出请求的自然方式,但为了避免使流代码依赖于<string>
,可以不提供cin.getline(std::string&)
函数。一旦字符串进入范围,以后可以添加独立的getline(cin, s)
。 char*
不是问题,因为#include
没有任何问题 - 无论如何都是语言的所有部分。
在某些方面,当语言允许以后的代码向现有类(例如Ruby)添加更多函数时,这很好,但在其他方面,非本地化会使得可维护性受到损害。当然,最小的成员函数和许多独立函数的流行论点是:我个人认为不应该使界面不那么直观和富有表现力,而是每个人都有自己的。
答案 3 :(得分:1)
iostreams库中的getline
变体不支持字符串作为目标,因此字符串库定义了一个变体。
答案 4 :(得分:1)
是的,现代C ++方式是使用自由函数并输入std :: string。
但IOStream的历史悠久(标准版本至少是同一设计的第三个版本)而不是std :: string,历史可以解释为什么事情就像它们一样。
(getline成员的优势在于它并不意味着动态分配;这个特性在时间上可以很方便,但可能不足以在从头开始设计中证明它。)
答案 5 :(得分:-1)
成员函数cin.getline()使用C字符串(即char数组),而自由函数std :: getline()使用C ++字符串(即std :: string。)你不应该使用C字符串在学习C ++时,这意味着你不应该使用cin.getline()。
std :: getline()从输入流中读取一个字符串,直到某个分隔符。默认情况下,分隔符是&#39; \ n&#39;如果您只是要传递换行符,则没有理由指定第三个参数。除了检查分隔符之外,它不知道或不关心该字符串中包含的内容。如果你想尝试将该字符串解析为整数或浮点值,你可以在从流中读取之后做到这一点,但那不是std :: getline()的工作。它只是读取一个字符串。