我是下面提到的程序:
string s;
cout<<"Enter a string:";
gets(s);
我希望我的输入形式为:“希尔顿酒店”。
在使用gets时,我收到以下错误:
error: cannot convert ‘std::string {aka std::basic_string<char>}’ to ‘char*’ for argument ‘1’ to ‘char* gets(char*)’
我不能使用“cin”,因为我希望我的输入包含空格和特殊字符,如'_'等,我也希望我的分隔符为'enter'。还有其他一些方法......或者请善意纠正错误。
答案 0 :(得分:4)
gets
不是非常c ++(它与C的兼容性)。使用此:
#include <iostream>
#include <string>
int main()
{
std::getline(std::cin, s);
std::cout << s << '\n';
}
另外,请查看std::ios::skipws
和<iomanip>
了解空格处理选项
答案 1 :(得分:0)
我不能使用“cin”,因为我希望我的输入包含空格和特殊字符
您可以使用cin
。
还有其他方式......或者请在纠正错误方面做得足够友善。
gets
收到char*
,因此请使用char*
代替string
。
答案 2 :(得分:0)
第一个问题:'gets'需要一个char数组来读入。你不能给它一个stl字符串,这没有任何意义。你需要做一些像
这样的事情char buf[1024];
gets(buf);
第二个问题:'gets'来自较旧的C stdio库。您不应该尝试将stdio访问与C ++样式的i / o混合使用 - 每个库都维护它自己的缓冲,并且只会产生混淆。如果您使用一个用于输入而另一个用于输出,您可能会使用它,但这是一个坏主意 - 学会使用C ++样式的输入来做你想要的(std :: getline,我认为,例程)你需要)。
第三,BIG HONKING问题:'获得'是早期C中那些讨厌的保持功能之一,不能安全使用。不要试图使用'获得'永远。
问题在于'获取'不知道它所读取的缓冲区的大小是多少,因此它总是能够溢出缓冲区并覆盖内存(导致各种潜在的问题)。千万不要尝试使用任何东西。如果您想进行stdio风格的输入,请使用
fgets(buf, bufsize, stdin)
采用缓冲区大小,不会超过它的输入缓冲区。