28

每次我做一个 C++ 代码行的快速片段

std::string s;
cin >> s;

我诅咒自己,因为我忘记了它停在空白处而不是整行。

然后,回想起来getline,我总是对这两种变体感到困惑:

std::string s;
getline (std::cin, s);

和:

char cs[256];
std::cin.getline (cs, sizeof (cs));

除了数据类型之外,这两者之间实际上有区别吗?

在我看来,C++ 方式应该是前者。在什么情况下我会使用后者,因为我可能应该使用真正的字符串而不是空终止字符数组?

而且,既然输入确实应该是输入流的权限,为什么前一部分不是istream

4

6 回答 6

28

全局getline()函数适用于 C++ std::string对象。

istream::getline()方法适用于“经典”C 字符串(指向 的指针)char

于 2011-02-02T08:57:44.203 回答
12

请记住,标准库由 3 个(主要)部分组成:IOStream、String 和 STL,外加一些东西和 C 头文件。

我认为这些部分松散耦合没有什么奇怪的(尽管我希望不是这样)。

其他不协调包括:std::string::lengthvs std::string::size,添加后者是为了与 STL 接口兼容,而保留前者是为了与旧代码兼容。

于 2011-02-02T09:14:49.453 回答
9

这是一个常见的界面设计问题。 cin.getline()是一种自然的请求方式,但为了避免流代码依赖于<string>,不能cin.getline(std::string&)提供任何函数。getline(cin, s)一旦将字符串纳入范围,以后可以添加独立式。这不是问题,char*因为没有什么#include- 无论如何都是语言的所有部分。

在某些方面,当语言允许以后的代码向现有类(例如 Ruby)添加更多功能时,这很好,但在其他方面,非本地化会咬人,而且会损害可维护性。当然,还有一个流行的论点是最小的成员函数和大量的独立函数:我个人认为不应该把界面变得不那么直观和富有表现力,而是每个人都有自己的。

于 2011-02-02T09:25:52.790 回答
2

iostreams 库中的getline变体不支持将字符串作为目标,因此字符串库定义了支持的变体。

于 2011-02-02T08:57:30.227 回答
1

是的,现代 C++ 方法是使用自由函数并输入 std::string。

但是 IOStream 的历史比 std::string 的历史要长得多(标准版本至少是同一设计的第三个化身),而这段历史解释了为什么事情是这样的。

(getline 成员的优点是它并不意味着动态分配;该特性有时会很方便,但可能不足以证明它在从头设计中的合理性)。

于 2011-02-02T09:08:23.073 回答
-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++,这意味着你不应该使用 cin.getline()。

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

于 2018-06-13T12:39:40.447 回答