0

我下面提到的程序:

string s;
cout<<"Enter a string:";
gets(s);

我希望我的输入采用以下形式:“希尔顿酒店”。

在使用获取时,我收到以下错误:

 error: cannot convert ‘std::string {aka std::basic_string<char>}’ to ‘char*’ for argument ‘1’ to ‘char* gets(char*)’

我不能使用“cin”,因为我希望我的输入由空格和特殊字符(如 '_' 等)组成,我也希望我的分隔符是 'enter'。有没有其他方法......或者请纠正错误。

4

3 回答 3

4

gets不是很 C++(它是为了与 C 兼容)。用这个:

#include <iostream>
#include <string>

int main()
{
    std::getline(std::cin, s);
    std::cout << s << '\n';
}

此外,请查看std::ios::skipws<iomanip>了解空格处理选项

于 2012-06-29T13:04:06.300 回答
0

我不能使用“cin”,因为我希望我的输入包含空格和特殊字符

您可以使用cin.

有没有其他方法......或者请纠正错误。

gets接收 a char*,所以使用 achar*而不是string.

于 2012-06-29T13:04:27.143 回答
0

第一个问题:'gets' 需要一个 char 数组来读入。你不能给它一个 stl 字符串,这没有任何意义。你需要做类似的事情

char buf[1024];
gets(buf);

第二个问题:“gets”来自较旧的 C stdio 库。您不应该尝试将 stdio 访问与 C++ 风格的 i/o 混合 - 每个库都维护自己的缓冲,只会导致混乱。如果您将一个用于输入,另一个用于输出,您可能会侥幸成功,但这是一个坏主意 - 学习使用 C++ 输入风格来做您想做的事(std::getline,我认为是例程你需要)。

第三,大喇叭问题:'gets' 是 C 早期的那些讨厌的保留功能之一,不能安全使用。永远不要尝试使用“获取”。

问题是“gets”不知道它正在读取的缓冲区的大小是多少,因此它总是能够溢出该缓冲区并覆盖内存(导致各种潜在问题)。永远不要尝试在任何事情中使用gets。如果你想做标准输入,使用

fgets(buf, bufsize, stdin)

它需要一个缓冲区大小并且不会超出它的输入缓冲区。

于 2012-06-29T13:10:53.037 回答