Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么有两个不同的getline()函数(如果确实有)? 每次我都会快速地对C++代码行< /p>进行代码片断 std::string s; cin >> s;_C++_String_Getline - Fatal编程技术网

为什么有两个不同的getline()函数(如果确实有)? 每次我都会快速地对C++代码行< /p>进行代码片断 std::string s; cin >> s;

为什么有两个不同的getline()函数(如果确实有)? 每次我都会快速地对C++代码行< /p>进行代码片断 std::string s; cin >> s;,c++,string,getline,C++,String,Getline,我诅咒自己,因为我忘了它停在空白处,而不是整行 然后,一想起getline,我总是对这两种类型感到困惑: std::string s; getline (std::cin, s); 以及: 除了数据类型之外,这两者之间真的有区别吗 在我看来,C++方式应该是前者。考虑到我可能应该使用实字符串,在什么情况下我会使用后者 还是空终止字符数组 而且,由于输入应该是输入流的权限,为什么前一部分不是代码> istRAM > IOFSUSTORE库中的“代码> GETLION/COD>变异体不支持字符串作

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

然后,一想起
getline
,我总是对这两种类型感到困惑:

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

除了数据类型之外,这两者之间真的有区别吗

在我看来,C++方式应该是前者。考虑到我可能应该使用实字符串,在什么情况下我会使用后者 还是空终止字符数组


而且,由于输入应该是输入流的权限,为什么前一部分不是代码> istRAM<?

< P> > IOFSUSTORE库中的“代码> GETLION/COD>变异体不支持字符串作为目标,所以字符串库定义了一个变异体,

< p>全局函数与C++对象一起工作。< /P>

方法使用“经典”C字符串(指针为代码> char < /COD>)。< /P> < P>是的,现代C++方式是使用自由函数并输入STD::String。 但是IOStream的历史要比std::string长得多(标准版本至少是同一设计的第三个化身),这段历史解释了为什么事情是这样的


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

请记住,标准库由3个(主要)部分组成:IOStream、String和STL,再加上一些糖果和C头球

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


其他不一致之处包括:
std::string::length
vs
std::string::size
,后者是为了与STL的接口兼容性而添加的,前者是为了与旧代码的兼容性而保留的。

这是一个常见的接口设计问题
cin.getline()
是发出请求的自然方式,但为了避免流代码依赖于
,不能提供
cin.getline(std::string&)
函数。将字符串引入范围后,可以添加独立的
getline(cin,s)
。对于
char*
来说,这不是问题,因为没有任何东西可以
#包括
-无论如何,语言的所有部分

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

来源:

成员函数CIN。GETILLY()使用C字符串(即char数组),而自由函数STD::GETLION()用C++字符串(即STD::String)工作。在学习C++时,不应该使用C字符串,也就是说,不应该使用CIN。GETLIN()。


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

那么,如果它输入的唯一东西是字符串,为什么它不是
s.getline(std::cin)
而不是破坏我可爱的
对象。method()
世界观?@paxdiablo,这可能是一个语义问题:
getline()
是一个流操作,而不是字符串操作,因此,将其作为
std::string
类的方法是很奇怪的。我猜它不知道,因此std::cin不能有返回std::string的方法。@Grozz,事实上,这两个类是不耦合的。“为什么它不是
s.getline(std::cin)
”--因为让
std::string
的实现依赖于
std::istream
甚至比v.v.“打破我可爱的对象.method()世界观”更糟糕--查找“泄漏抽象”和“多重分派”。这种对软件的看法从一开始就被打破了。我认为这个短语是“松散耦合的”,“集成不良”有着负面的含义。我认为这是一件好事(tm),你可以使用
std::string
而不需要
std::istream
,也可以使用
std::istream
而不需要
std::string
。@Charles:如果我告诉你我在点击“提交”之前做了完全相反的更改,你会相信我吗?我个人更喜欢一个更“统一”的标准图书馆。C++标准库是“有机增长”的缩影。查尔斯:我绝对认为IOFS和String没有耦合是错误的。我的意思是,iostream依赖于对字符串的基本操作。减少依赖性是一回事,如果您不是字符串类,提供使用C-string的成员函数是不可原谅的。@Puppy:我绝对不同意iostream依赖于操作字符串,这似乎是唯一一个明确说明为什么这种脱钩是通过设计实现的答案。毕竟,
string
iostream
更新这一事实本身并不能充分解释为什么后者没有被改装。我假设曾经有一段时间,这个决定争议较少,并且拥有一个未使用的
字符串
类的开销相对较大
char cs[256];
std::cin.getline (cs, sizeof (cs));