linux中gets()函数和fgets()函数
来源:互联网 发布:京东和淘宝哪个靠谱 编辑:程序博客网 时间:2024/06/10 01:28
在学习c语言时遇到这样的问题,当需要输入字符串的时候,我们会用到gets()函数,当我们gcc编译时会遇到一个警告,这让我们编程时感觉很不爽。究其原因,就是gets()函数在输入时没有限定字符串的长度,而linux是很严谨的,所以这里给出一warning。
但我们编程时会有很多的替代函数,例如fgets()函数就完全可以替代了gets()函数。
例如:输入字符串:char string[LENGTH];
gets(string);
fgets(string, LENGTH, stdin);
这样就可以用fgets完美的替代了gets,而且还帮我们检查了一个错误,万一#define LENGTH 16,如果输入了18个字符,会出现让大家意想不到的结果。
我的测试结果分别是:
用scanf(),进行输入时,如果你输入的字符数大于16,输出的是你输入的你输入的字符个数,而不是你当时定义的字符串长度。即:
输入 a = aaaaaaaaaaaaaaaaaaaaaaa
输出 a = aaaaaaaaaaaaaaaaaaaaaaa
用gets(),进行输入时,在编译会给你一warning,但是当你输入的长度大于定义时的长度时,在输出时的结果是:
输入 a = aaaaaaaaaaaaaaaaaaaaaaa
输出
a = aaaaaaaaaaaaaaaaaaaaaaa
*** stack smashing detected ***: ./a.out terminated
======= Backtrace: =========
/lib/tls/i686/cmov/libc.so.6(__fortify_fail+0x50)[0xc16390]
/lib/tls/i686/cmov/libc.so.6(+0xe233a)[0xc1633a]
./a.out[0x80484ce]
/lib/tls/i686/cmov/libc.so.6(__libc_start_main+0xe6)[0xb4abd6]
./a.out[0x80483e1]
======= Memory map: ========
001a9000-001c4000 r-xp 00000000 08:06 1839106 /lib/ld-2.11.1.so
001c4000-001c5000 r--p 0001a000 08:06 1839106 /lib/ld-2.11.1.so
001c5000-001c6000 rw-p 0001b000 08:06 1839106 /lib/ld-2.11.1.so
00b34000-00c87000 r-xp 00000000 08:06 1839125 /lib/tls/i686/cmov/libc-2.11.1.so
00c87000-00c88000 ---p 00153000 08:06 1839125 /lib/tls/i686/cmov/libc-2.11.1.so
00c88000-00c8a000 r--p 00153000 08:06 1839125 /lib/tls/i686/cmov/libc-2.11.1.so
00c8a000-00c8b000 rw-p 00155000 08:06 1839125 /lib/tls/i686/cmov/libc-2.11.1.so
00c8b000-00c8e000 rw-p 00000000 00:00 0
00cfb000-00cfc000 r-xp 00000000 00:00 0 [vdso]
00eb2000-00ecf000 r-xp 00000000 08:06 1835093 /lib/libgcc_s.so.1
00ecf000-00ed0000 r--p 0001c000 08:06 1835093 /lib/libgcc_s.so.1
00ed0000-00ed1000 rw-p 0001d000 08:06 1835093 /lib/libgcc_s.so.1
08048000-08049000 r-xp 00000000 08:06 1048831 /home/qiao/c_program/3_program/list/a.out
08049000-0804a000 r--p 00000000 08:06 1048831 /home/qiao/c_program/3_program/list/a.out
0804a000-0804b000 rw-p 00001000 08:06 1048831 /home/qiao/c_program/3_program/list/a.out
09543000-09564000 rw-p 00000000 00:00 0 [heap]
b777e000-b777f000 rw-p 00000000 00:00 0
b778e000-b7792000 rw-p 00000000 00:00 0
bfcbc000-bfcd1000 rw-p 00000000 00:00 0 [stack]
已放弃
堆栈溢出,这在我们编程时是非常可怕的。所以以后要慎用。
推荐在字符串输入时用fgets()函数。
他会截取我们开始定义时的长度,注意的一点是fgets()函数会给字符串预留一个\0的位置,就是我们输入了8个字符,输出时只输出7个有效字符。最后一个给了\0.
最后再补充一点:gets()和fgets()函数是就收回车的,而scanf()不接收回车。
就先说到这吧。
如果谁有不明白的,或者其他更好的用法时,我很乐意一起讨论的。
我的邮箱:qiaozqjhsy@gmail.com
但我们编程时会有很多的替代函数,例如fgets()函数就完全可以替代了gets()函数。
例如:输入字符串:char string[LENGTH];
gets(string);
fgets(string, LENGTH, stdin);
这样就可以用fgets完美的替代了gets,而且还帮我们检查了一个错误,万一#define LENGTH 16,如果输入了18个字符,会出现让大家意想不到的结果。
我的测试结果分别是:
用scanf(),进行输入时,如果你输入的字符数大于16,输出的是你输入的你输入的字符个数,而不是你当时定义的字符串长度。即:
输入 a = aaaaaaaaaaaaaaaaaaaaaaa
输出 a = aaaaaaaaaaaaaaaaaaaaaaa
用gets(),进行输入时,在编译会给你一warning,但是当你输入的长度大于定义时的长度时,在输出时的结果是:
输入 a = aaaaaaaaaaaaaaaaaaaaaaa
输出
a = aaaaaaaaaaaaaaaaaaaaaaa
*** stack smashing detected ***: ./a.out terminated
======= Backtrace: =========
/lib/tls/i686/cmov/libc.so.6(__fortify_fail+0x50)[0xc16390]
/lib/tls/i686/cmov/libc.so.6(+0xe233a)[0xc1633a]
./a.out[0x80484ce]
/lib/tls/i686/cmov/libc.so.6(__libc_start_main+0xe6)[0xb4abd6]
./a.out[0x80483e1]
======= Memory map: ========
001a9000-001c4000 r-xp 00000000 08:06 1839106 /lib/ld-2.11.1.so
001c4000-001c5000 r--p 0001a000 08:06 1839106 /lib/ld-2.11.1.so
001c5000-001c6000 rw-p 0001b000 08:06 1839106 /lib/ld-2.11.1.so
00b34000-00c87000 r-xp 00000000 08:06 1839125 /lib/tls/i686/cmov/libc-2.11.1.so
00c87000-00c88000 ---p 00153000 08:06 1839125 /lib/tls/i686/cmov/libc-2.11.1.so
00c88000-00c8a000 r--p 00153000 08:06 1839125 /lib/tls/i686/cmov/libc-2.11.1.so
00c8a000-00c8b000 rw-p 00155000 08:06 1839125 /lib/tls/i686/cmov/libc-2.11.1.so
00c8b000-00c8e000 rw-p 00000000 00:00 0
00cfb000-00cfc000 r-xp 00000000 00:00 0 [vdso]
00eb2000-00ecf000 r-xp 00000000 08:06 1835093 /lib/libgcc_s.so.1
00ecf000-00ed0000 r--p 0001c000 08:06 1835093 /lib/libgcc_s.so.1
00ed0000-00ed1000 rw-p 0001d000 08:06 1835093 /lib/libgcc_s.so.1
08048000-08049000 r-xp 00000000 08:06 1048831 /home/qiao/c_program/3_program/list/a.out
08049000-0804a000 r--p 00000000 08:06 1048831 /home/qiao/c_program/3_program/list/a.out
0804a000-0804b000 rw-p 00001000 08:06 1048831 /home/qiao/c_program/3_program/list/a.out
09543000-09564000 rw-p 00000000 00:00 0 [heap]
b777e000-b777f000 rw-p 00000000 00:00 0
b778e000-b7792000 rw-p 00000000 00:00 0
bfcbc000-bfcd1000 rw-p 00000000 00:00 0 [stack]
已放弃
堆栈溢出,这在我们编程时是非常可怕的。所以以后要慎用。
推荐在字符串输入时用fgets()函数。
他会截取我们开始定义时的长度,注意的一点是fgets()函数会给字符串预留一个\0的位置,就是我们输入了8个字符,输出时只输出7个有效字符。最后一个给了\0.
最后再补充一点:gets()和fgets()函数是就收回车的,而scanf()不接收回车。
就先说到这吧。
如果谁有不明白的,或者其他更好的用法时,我很乐意一起讨论的。
我的邮箱:qiaozqjhsy@gmail.com
0
上一篇:Android WIFI模块分析
下一篇:函数参数的传递问题(一级指针和二级指针)
相关热门文章
- test123
- 编写安全代码——小心有符号数...
- 使用openssl api进行加密解密...
- 一段自己打印自己的c程序...
- sql relay的c++接口
- linux dhcp peizhi roc
- 关于Unix文件的软链接
- 求教这个命令什么意思,我是新...
- sed -e "/grep/d" 是什么意思...
- 谁能够帮我解决LINUX 2.6 10...
给主人留下些什么吧!~~
评论热议
0 0
- linux中gets()函数和fgets()函数
- gets和fgets函数
- gets()函数和fgets()函数
- gets函数和fgets函数
- fgets函数和gets函数
- gets函数和fgets函数
- gets,gets_s,fgets函数
- fgets()和gets()函数的区别
- fgets()和gets()函数的区别
- gets和fgets函数的区别
- fgets和gets函数的区别
- gets和fgets函数的区别
- 关于gets函数和fgets函数的一些理解
- Linux下输入函数fgetc, fgets, getc, getchar, gets使用
- Linux C 字符串输入函数 gets()、fgets()、scanf() 详解
- C语言中gets、fgets以及fputs函数
- C语言中gets是危险函数,用fgets代替
- Linux中fgets函数注意事项
- 工薪阶层如何用5年理出100W?绝对实用方法
- Linux驱动学习之:PWM驱动
- Android之Wifi学习(1)
- Android之Wifi学习(2)------连接Wifi
- Android WIFI模块分析
- linux中gets()函数和fgets()函数
- 函数参数的传递问题(一级指针和二级指针)
- 为什么要使用copy_from_user?
- linux设备驱动归纳总结(三):4.ioctl的实现
- Java并发与多线程(2) 生产者与消费者
- arm中的PLL,MPLL,UPLL,FCLK,HCLK,PCLK的作用概述
- NOR FLASH驱动程序
- 存储管理
- Linux驱动学习笔记(3)字符设备驱动
原创粉丝点击
热门IT博客