fgets函数的用法 Linux,linux中gets()函数和fgets()函数

在学习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

阅读(2) | 评论(0) | 转发(0) |

0

上一篇:Android WIFI模块分析

下一篇:函数参数的传递问题(一级指针和二级指针)

相关热门文章

test123

编写安全代码——小心有符号数...

使用openssl api进行加密解密...

一段自己打印自己的c程序...

sql relay的c++接口

linux dhcp peizhi roc

关于Unix文件的软链接

求教这个命令什么意思,我是新...

sed -e "/grep/d" 是什么意思...

谁能够帮我解决LINUX 2.6 10...

给主人留下些什么吧!~~

评论热议

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值