回车,ASCII码13
换行,ASCII码10
空格,ASCII码32
C-Free测试。
(1)gets(char *buf)从stdin流中读取字符串。
接受到换行符或EOF时停止。
换行符不作为读取串的内容,转换为’\0’,ASCII码值为0。
不判断溢出。溢出的字符写入堆栈覆盖堆栈原先内容(易出错)。
strlen由实际输入的长度决定,不受buf的长度限制。
使用时须保证字符低于buf的大小,否则覆盖堆栈可能引起错误。
(2)fgets函数fgets(str,n,fp)从文件或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许溢出不报错,即使溢出也会自动添加结束符,依然可以正常输出, 但可能引发栈区覆盖,造成其他异常。