关于puts,gets的问题

li4c 2013-12-30 09:05:23
//

#include "stdafx.h"
#include "stdio.h"
int main()
{
char str1;
char str2[10];
puts("please enter a character ");
str1=getchar(); //获取字符
putchar(str1); //输出获得的字符
puts("please enter string");// 提示输入字符串
gets(str2); //从输入流中抓取字符串
puts(str2); //输出获得的字符串
return 0;
}

请问大神,这是什么问题
...全文
244 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
ForestDB 2013-12-30
  • 打赏
  • 举报
回复
第一,不存在不知道的时候; 即你一定会知道要读多少个字符,然后定义这么大小的buffer,并调用; (比如可以先读入一个整数,表示用户会输入这么多个字符,但这种场景很少见,不过它确实工作) printf("how many characters would you input? "); int n; scanf("%d", &n); char * buffer = malloc(n); gets_s(buffer, n); ... free(buffer); (又或者,作为程序的实现者,你可以定义你只读80个字符,然后问题就简单了; 总之,你一定知道会又多少个字符) 第二,确实不知道个数; 这种情况下,问题的解决方法就是“反复读”,直到读入的字符串的长度小于你的buffer的大小,这就表示读到了结尾的\n,大概是这样: char buffer[80 + 1]; gets_s(buffer, 81); // process_buffer while (strlen(buffer) == 80) { gets_s(buffer, 81); // process buffer's content } 作为练习,你可以想想如果输入了80个字符,然后是个回车,这个程序是怎么跑的。
li4c 2013-12-30
  • 打赏
  • 举报
回复
引用 9 楼 ForestDB 的回复:
这个error能看懂吧。 至于gets为什么不安全,很简单,它和任何传统的C的API一样,不做边界检查,从而对于不成熟的C程序员来说,一不留神就越界了。 至于C的哲学,最基本的一条就是它假定程序员知道自己在干什么,包括越界。 但是对于C的菜鸟来说,基本上是不知道自己在干什么的,对此就有了gets_s这的函数,会多个参数,限制能输入的字符的个数 但是,对C的菜鸟来说,还是可能搬石头砸自己的脚,比如 char buffer[64]; gets_s(buffer, 128); // 注意这里的size比实际分配的要大 所以,终极要义是要明白自己在干什么。
引用 9 楼 ForestDB 的回复:
这个error能看懂吧。 至于gets为什么不安全,很简单,它和任何传统的C的API一样,不做边界检查,从而对于不成熟的C程序员来说,一不留神就越界了。 至于C的哲学,最基本的一条就是它假定程序员知道自己在干什么,包括越界。 但是对于C的菜鸟来说,基本上是不知道自己在干什么的,对此就有了gets_s这的函数,会多个参数,限制能输入的字符的个数 但是,对C的菜鸟来说,还是可能搬石头砸自己的脚,比如 char buffer[64]; gets_s(buffer, 128); // 注意这里的size比实际分配的要大 所以,终极要义是要明白自己在干什么。
谢谢你的帮助,受教了,请问我不知道我要获得多少个字符的时候gets_s的第二个参数我该怎么填呢
ForestDB 2013-12-30
  • 打赏
  • 举报
回复
就这个问题而言,本身有两种方法解决: 1、使用get_s而不是gets,正如error中推荐的一般; 2、使用_CRT_SECURE_NO_WARNINGS宏,告诉编译器自己铁了心的想用gets
ForestDB 2013-12-30
  • 打赏
  • 举报
回复
这个error能看懂吧。 至于gets为什么不安全,很简单,它和任何传统的C的API一样,不做边界检查,从而对于不成熟的C程序员来说,一不留神就越界了。 至于C的哲学,最基本的一条就是它假定程序员知道自己在干什么,包括越界。 但是对于C的菜鸟来说,基本上是不知道自己在干什么的,对此就有了gets_s这的函数,会多个参数,限制能输入的字符的个数 但是,对C的菜鸟来说,还是可能搬石头砸自己的脚,比如 char buffer[64]; gets_s(buffer, 128); // 注意这里的size比实际分配的要大 所以,终极要义是要明白自己在干什么。
li4c 2013-12-30
  • 打赏
  • 举报
回复
引用 5 楼 ForestDB 的回复:
这是最新的VS吧,这个版本的VS不推荐用gets的,而是要用gets_s这样的函数。 另外LZ应该贴编译信息,而不是最终的一个截图。
这个是visual studio 2012版本,因为我的电脑闹安装6.0版本的用不了,才不得已用这个的
li4c 2013-12-30
  • 打赏
  • 举报
回复
引用 6 楼 ForestDB 的回复:
多半就是因为gets,导致编译就没有完成,没有产生.exe文件,进而出现截图中的对话框。 还请贴出编译信息,可以看到warning,error什么的。
------ 已启动生成: 项目: character, 配置: Debug Win32 ------
1>  character.cpp
1>c:\users\i love u\desktop\新建文件夹\character\character\character.cpp(14): error C4996: 'gets': This function or variable may be unsafe. Consider using gets_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
1>          d:\tmqq\vc\include\stdio.h(261) : 参见“gets”的声明
========== 生成: 成功 0 个,失败 1 个,最新 0 个,跳过 0 个 ==========
刚才在MSDN Library上查了一下
gets_s
是gets的更安全版本,还想请教您一下,gets为什么不安全
ForestDB 2013-12-30
  • 打赏
  • 举报
回复
多半就是因为gets,导致编译就没有完成,没有产生.exe文件,进而出现截图中的对话框。 还请贴出编译信息,可以看到warning,error什么的。
ForestDB 2013-12-30
  • 打赏
  • 举报
回复
这是最新的VS吧,这个版本的VS不推荐用gets的,而是要用gets_s这样的函数。 另外LZ应该贴编译信息,而不是最终的一个截图。
li4c 2013-12-30
  • 打赏
  • 举报
回复
引用 3 楼 derekrose 的回复:
[quote=引用 2 楼 u013163178 的回复:] [quote=引用 1 楼 derekrose 的回复:] 我从你的描述中看不出问题是什么
编译的时候总是提示错误 [/quote] 这个应该是运行的时候吧[/quote]这个是在编译的时候就出现的
derekrose 2013-12-30
  • 打赏
  • 举报
回复
引用 2 楼 u013163178 的回复:
[quote=引用 1 楼 derekrose 的回复:] 我从你的描述中看不出问题是什么
编译的时候总是提示错误 [/quote] 这个应该是运行的时候吧
li4c 2013-12-30
  • 打赏
  • 举报
回复
引用 1 楼 derekrose 的回复:
我从你的描述中看不出问题是什么
编译的时候总是提示错误
derekrose 2013-12-30
  • 打赏
  • 举报
回复
我从你的描述中看不出问题是什么

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧