![](/img/trans.png)
[英]std::getline( basic_istream<...> &&input, basic_string<...> &str ) with rvalue-"input"
[英]getline in istream and getline in basic_string
string text;
getline(text.c_str(),256);
1)我收到错误“错误:没有匹配函数调用'getline(const char *,int)”上面有什么错误,因为text.c_str()
也返回一个指向字符数组的指针。
如果我这样写
char text[256]
cin.getline(text, 256 ,'\n');
它工作正常。 cin.getline和getline有什么区别?
2)怎么样
text string;
getline(cin,text,'\n')
接受整行作为输入。 指向这一个字符数组的指针在哪里?
text.c_str()
返回一个const char *
。 您不能 以任何方式使用它来修改字符串的内容。 它只存在,以便您可以将字符串数据传递给旧的C API函数,而无需复制。 您不能进行更改,因为保存数据的字符串对象无法找到它们 ,因此这将允许您打破字符串的不变量。
此外, std::getline
接受完全不同的参数 。 (如果你花了两秒钟向Google输入'std :: getline',你就会知道这一点。)错误意味着它所说的内容:“没有匹配的调用函数”意味着“你不能用这些类型调用函数参数“,因为函数的每个重载都接受不同的(并且不兼容)。
std::getline
接受以下参数:
实际上没有 “cin.getline” 这样的功能 。 你所调用的是对象 “cin”的成员函数“getline” - 一个在#include <iostream>
时为你定义的全局变量。 我们通常根据函数定义的类来引用它 - 因此, std::istream::getline
。
std::istream::getline
接受以下参数:
它不需要stream参数,因为它是流的成员函数:它使用我们称之为的任何流。
我真的没有得到提问者试图做的事情。
C ++允许函数重载,所以编译器正在寻找一个名为getline的自由函数,它匹配你传递的参数,并且不存在这样的函数,也不存在( getline(const char*, int)
究竟会做什么?)
多次询问为什么getline(istream&, string&)
是一个“自由”函数而不是iostream接口的一部分。 建议的答案是iostream过时的STL或者iostream没有依赖于basic_string类(任何地方,这也是为什么打开文件是用原始指针完成的),而Herb Sutter会赞扬让getline成为一个自由函数,因为他觉得是类成员函数应该是最小的(并且std :: string有太多,例如find函数可以是使用该类的免费函数)。
关于该功能的一件事是,它是多么有用,因为你不需要预先分配一个缓冲区并“猜测”它有多大。 (话虽如此,如果你从一个大文件读到一个std :: string,如果没有找到新行,你可以使用bad_alloc!)。
text.c_str()
是一个const
字符数组。 const
意味着你或任何函数(包括任何类型的getline
)都不会写入它。
没有可移植的方法将string
用作可写字符数组。 但必要时,您可以使用vector<char>
代替:
std::vector<char> buffer(256);
std::size_t len = cin.getline(&buffer[0], buffer.size());
std::string text(&buffer[0], len);
但是在这里使用getline
的string
重载可能是最好的。
string::c_str()
返回一个const char *
,而不是char *
。 getline
使用字符串,所以你想要的是
string text;
getline(cin, text, '\n');
此版本的getline
允许字符串根据需要增长。 如果需要将其限制为特定数量的字符,则需要使用vector<char>
如上一个答案中所示。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.