为什么有两个不同的getline()函数(如果确实存在)?

时间:2011-02-02 08:48:43

标签: c++ string getline

每次我快速编写一段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的前一部分?

6 个答案:

答案 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)

来源:https://www.reddit.com/r/learnprogramming/comments/4fx64h/is_there_a_difference_between_cingetline_and/

成员函数cin.getline()使用C字符串(即char数组),而自由函数std :: getline()使用C ++字符串(即std :: string。)你不应该使用C字符串在学习C ++时,这意味着你不应该使用cin.getline()。

std :: getline()从输入流中读取一个字符串,直到某个分隔符。默认情况下,分隔符是&#39; \ n&#39;如果您只是要传递换行符,则没有理由指定第三个参数。除了检查分隔符之外,它不知道或不关心该字符串中包含的内容。如果你想尝试将该字符串解析为整数或浮点值,你可以在从流中读取之后做到这一点,但那不是std :: getline()的工作。它只是读取一个字符串。