1

谁能告诉我为什么gets(abc) 与char[] 一起使用而不与int 一起使用?

 int abc;
 char name[] = "lolrofl";
 printf("Hello %s.\n",name);
 printf("\n >> ");
 fflush(stdin);
 gets (abc);
 printf("\n die zahl ist %i.\n",abc);
 system("Pause");
 return(0);
4

4 回答 4

11

get()的原型是:

char* 获取(char *s);

请注意,该函数不会只读取单个字符并将其放在 s 中;它实际上将整个字符串读入 s。但是,由于gets() 没有提供指定要读取的最大字符数的方法,因此实际上可以将更多的字符读入s 中,而不是为s 分配的字节数。因此,这个函数是一个严重的缓冲区溢出漏洞,你永远不要使用这个函数。还有一些替代的、更安全的函数允许您读取用户的输入,例如fgets()getc()

如果您使用 C++,那么使用C++ I/O 流库(std::cin、std::cout、std::ostream、std::istream、std::fstream 等)是更好的方法执行输入/输出而不是使用这些其他功能。

get() 函数太危险了,事实上,在我开发和编写自定义搜索引擎的过程中,我已经对gets和其他几个这样的函数进行了宣传,警告不要使用它!

于 2010-04-22T19:27:13.193 回答
4

因为它只读取字符。使用 scanf() 进行格式化读取。

顺便说一句,由于您似乎正在使用 C++(或者至少您选择的标签是这样说的),也许您应该尝试 std::cin/std::cout。

于 2010-04-22T19:26:23.317 回答
1

如果您查看 C Reference,您的问题将得到解答。我给你贴一下:

char *gets( char *str );

get() 函数从标准输入读取字符并将它们加载到 str 中,直到到达换行符或 EOF。换行符被转换为空终止符。get() 的返回值是读入的字符串,如果有错误,则返回 NULL。请注意,gets() 不执行边界检查,因此存在超出 str 的风险。有关包含边界检查的类似(且更安全)函数,请参阅 fgets()。

因此,您将无法将整个字符串转换为整数。

于 2010-04-22T19:33:49.840 回答
0

首先,该gets函数用于读取字符串文本,而不是数字。

其次,不要使用gets,因为它有缓冲区溢出错误。有关详细信息,请参阅C 语言常见问题解答。该功能fgets是一种更安全的选择。

第三,您可能想要切换到 C++ 流和std::string. C++ 流比 C 流更友好。

第四,fflush对输入流不起作用。该fflush函数用于将流缓冲区中的剩余数据写入输出流。在 C++ 中,有一个方法,ignore,它将忽略传入的字符,直到换行符(默认)或指定的字符被读取(或达到限制)。

希望有帮助。

于 2010-04-23T01:32:28.897 回答