首页
学习
活动
专区
圈层
工具
发布

gets出错
EN

Stack Overflow用户
提问于 2012-06-29 21:03:00
回答 3查看 122关注 0票数 0

以下是我提到的程序:

代码语言:javascript
复制
string s;
cout<<"Enter a string:";
gets(s);

我希望我的输入是:"Hilton Hotels“。

在使用get时,我得到以下错误:

代码语言:javascript
复制
 error: cannot convert ‘std::string {aka std::basic_string<char>}’ to ‘char*’ for argument ‘1’ to ‘char* gets(char*)’

我不能使用"cin“,因为我希望我的输入由空格和特殊字符组成,如”_“等,我还希望我的分隔符是”enter“。有没有其他的way...or,请帮我纠正这个错误。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-06-29 21:04:06

gets不太像c++ (它是为了与C语言兼容)。使用以下命令:

代码语言:javascript
复制
#include <iostream>
#include <string>

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

此外,还可以查看std::ios::skipws和中的空白处理选项

票数 4
EN

Stack Overflow用户

发布于 2012-06-29 21:04:27

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

您可以使用cin

还有其他的way...or吗?请好心纠正这个错误。

gets接收char*,因此使用char*而不是string

票数 0
EN

Stack Overflow用户

发布于 2012-06-29 21:10:53

第一个问题:‘get’接受一个要读入的字符数组。你不能给它一个stl字符串,这没有任何意义。你需要做像这样的事情

代码语言:javascript
复制
char buf[1024];
gets(buf);

第二个问题:‘get’来自旧的C stdio库。你不应该尝试把stdio访问和C++风格的i/o混在一起--每个库都有自己的缓冲,只会导致混淆。如果您使用一个作为输入,另一个作为输出,您可能不会受到影响,但这不是一个好主意--学习使用C++样式的输入来做您想做的事情(std::getline,我认为这是您需要的例程)。

第三,大的喇叭问题:‘get’是早在C语言早期的一个讨厌的等待函数,不能安全地使用。永远不要尝试使用‘get’。

问题是“get”不知道它正在读取的缓冲区的大小,所以它总是能够溢出该缓冲区并覆盖内存(导致各种潜在问题)。不要试图在任何事情中使用gets。如果要进行stdio样式的输入,请使用

代码语言:javascript
复制
fgets(buf, bufsize, stdin)

它接受一个缓冲区大小,并且不会超载它的输入缓冲区。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11262313

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档