关于gets,fgets,scanf

回车,ASCII13

换行,ASCII10
空格,ASCII32


 C-Free测试。


(1)gets(char *buf)stdin流中读取字符串。

接受到换行符或EOF时停止。

换行符不作为读取串的内容,转换为\0ASCII码值为0

不判断溢出。溢出的字符写入堆栈覆盖堆栈原先内容(易出错)。

strlen由实际输入的长度决定,不受buf的长度限制。

使用时须保证字符低于buf的大小,否则覆盖堆栈可能引起错误。

 

(2)fgets函数fgetsstrnfp)从文件或stdin中读入字符串。

读到换行符或一个EOF则结束本次读操作,

最多只能读入n-1个字符。

读入结束后,系统将自动在最后(第n个位置下表为n-1)加换行符 ASCII码值为10

strlen依据输入的数据长度和定义的n的长度决定。

说明:

fgets截取用户输入的字符串有两种方式,一种是用户输入换行符,另一种是直接超过了定义的n的长度后按的换行符。

举例直观说明:

char ch[5] = {1,2,3,4,5};

fgets(ch,5,stdin);

strlen(ch);

1 2 3 4 5

a b   <cr>   \0

ab c    <cr>\0

a b c d  \0


  用户输入字符数

3

4

......

 strlen

4

4

4

处理方式

加换行符

结束符

结束符

 

 (3)scanf("%s",&s)gets(s)函数相似,但不完全相同,使用scanf("%s",&s)函数输入字符串时存在一个问题,就是如果输入了空格会认为字符串结束空格后的字符将作为下一个输入项处理,但gets()函数将接收输入的整个字符串直到遇到换行为止。

 

(4)关于结束符的总结如下:

gets以换行符作为结束,并在保存到缓冲变量中的时候讲换行符转换为结束符

fgets如果字符长度没超过n-2则末尾会有一个结束符,结束符前面有个换行符。

一旦超过n-2个则自动被n-1位置的\0截取而不再由换行符来截取。

scanf以空格或换行符作为作为结束并替换为结束符保存到缓存变量中。

而且scan许溢出不报错,即使溢出也会自动添加结束符,依然可以正常输出, 但可能引发栈区覆盖,造成其他异常。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值