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')
接受整行作为输入。指向这一个字符数组的指针在哪里?
答案 0 :(得分:6)
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参数,因为它是流的成员函数:它使用我们称之为的任何流。
答案 1 :(得分:3)
我真的没有得到提问者试图做的事情。
C ++允许函数重载,所以编译器正在寻找一个名为getline的自由函数,它匹配你传递的参数,并且不存在这样的函数,也不存在(无论如何getline(const char*, int)
会做什么?)< / p>
多次询问这个问题为什么getline(istream&, string&)
是一个“自由”函数,而不是iostream接口的一部分。建议的答案是iostream过时的STL或者iostream没有依赖于basic_string类(任何地方,这也是为什么打开文件是用原始指针完成的),而Herb Sutter会赞扬让getline成为一个自由函数,因为他觉得是类成员函数应该是最小的(并且std :: string有太多,例如find函数可以是使用该类的免费函数)。
关于该功能的一件事是,它是多么有用,因为你不需要预先分配一个缓冲区并“猜测”它有多大。 (话虽如此,如果你从一个大文件读到一个std :: string,如果没有找到新行,你可以使用bad_alloc!)。
答案 2 :(得分:1)
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);
但是,使用string
的{{1}}重载可能最好。
答案 3 :(得分:1)
string::c_str()
会返回const char *
,而非char *
。 getline
使用字符串,所以你想要的是
string text;
getline(cin, text, '\n');
此版本的getline
允许字符串根据需要增长。如果您需要将其限制为特定数量的字符,则需要使用上一个答案中的vector<char>
。