获取错误

Error with gets

本文关键字:取错误 获取      更新时间:2023-10-16

我下面提到的程序:

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

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

#include <iostream>
#include <string>
int main()
{
    std::getline(std::cin, s);
    std::cout << s << 'n';
}

另请查看std::ios::skipws<iomanip>以获取空格处理选项

我不能使用"cin",因为我希望我的输入由空格和特殊字符组成

您可以使用cin .

还有其他方法吗...或者请善意地纠正错误。

gets收到char*,所以使用char*而不是string

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

char buf[1024];
gets(buf);

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

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

问题是"gets"不知道它读取的缓冲区的大小是多少,所以它总是能够溢出缓冲区并覆盖内存(导致各种潜在问题)。永远不要尝试使用任何东西。如果要执行 stdio 样式输入,请使用

fgets(buf, bufsize, stdin)

它采用缓冲区大小,并且不会溢出其输入缓冲区。