获取错误

时间:2012-06-29 13:03:00

标签: c++

我是下面提到的程序:

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'。还有其他一些方法......或者请善意纠正错误。

3 个答案:

答案 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)

采用缓冲区大小,不会超过它的输入缓冲区。