16 - 10 - 23 字符串输入(fputs()函数)溢出的原理
2016-10-23 21:22
471 查看
#include<stdio.h> #include<string.h> int main() { int i; char str1[99],str2[99]; puts("输入:"); fgets(str1,5,stdin); fgets(str2,6,stdin); puts("输出:"); for(i=0;i<4;i++) printf("%d\n",(int)str2[i]); return 0; }
(注意‘\n的ASCII码值是‘10’ )
我们输入AAAADD,此时 AAAA‘\0’ 这五个字符被保存在str1[]数组里,由于fputs()函数会保留用户输入的换行符,所以用户输入的数据在输入缓冲区的表现是: “AAAADD\n” 敲下回车键,\n随字符串一起被函数使用。第一个fgets()函数限制5个字符,所以它读取AAAA并加上‘\0’。此时DD\n 在缓冲区里老老实实地待着,等待着哪一个函数把它领养走,此时 第二个 fgets()函数来啦!她就把DD\n这三个字符小朋友 装入了自己的筐子里。并把自己缺少的初始化为‘\0’.
也就是说,当我们调用一个fputs()函数却不幸被溢出时,需要妥善处理留在输入缓冲区里的剩余字符,以免对后续输入产生不良影响。
对《c primer plus》 第14章的一点注释; 如有错误,万望指正,感激不尽。
相关文章推荐
- 10、 java 编写一个截取字符串的函数,输入为一个字符串和字节数,输出为按字节截取的字符串。 要求不能出现截半的情况
- C Primer Plus学习 二十六 字符串输入 fputs ()函数
- 10、 java 编写一个截取字符串的函数,输入为一个字符串和字节数,输出为按字节截取的字符串。 要求不能出现截半的情况
- 字符串输入gets()、fgets()和字符串输出puts()、fputs()函数
- 输入n个整数,编写函数实现以下操作,要求用指针实现: (1) 对n个数进行排序; (2) 将从指定位置的m个数逆序存放,例如:原序列为2,4,6,8,10,12,14,16,18,20,若要求把
- 设计一个程序,从键盘上输入若干字符串,利用算法库中的查找函数对给定的字符串进行查找,将查找后的结果输出
- 编程:编写一个截取字符串的函数,输入为一个字符串和字节数,输出为按字节截取的字符串。 但是要保证汉字不被截半个,如"我ABC"4,应该截为"我AB",输入"我ABC汉DEF",6,应该输出为"我ABC"而不是"我ABC+汉的半个"。
- 字符串16进制转10进制
- 字符串读写函数fgets和fputs
- |1|2|3|4|5|6|7|8|9|10|11|12|13|14|15|16|17|18|19|20所有这些字符串,把它的数字一个个剥离??
- 字符串16进制转10进制
- 字符串读写函数fgets和fputs
- 字符串读写函数fgets和fputs
- 使用AS3自带函数进2/8/10/16/32进制互换
- 字符串的输入和输出(认识gets()fgets()scanf()和puts()fputs()printf()) ---CCS常用STDIO
- 【每天算法4】编写一个截取字符串的函数,输入为一个字符串和字节数,输出为按字节截取的字符串。
- 编程:编写一个截取字符串的函数,输入为一个字符串和字节数,输出为按字节截取的字符串。 但是要保证汉字不被截半个,如“我ABC”4,应该截为“我AB”,输入“我ABC汉DEF”,6,应该输出为“我ABC”而不是“我ABC+汉的半个”。
- 按weskercn的思路写的程序,问题(2)解答:把键盘输入的16,10,8进制数转换为2进制输出
- 编程:编写一个截取字符串的函数,输入为一个字符串和字节数,输出为按字节截取的字符串
- 编程:编写一个截取字符串的函数,输入为一个字符串和字节数,输出为按字节截取的字符串。 但是要保证汉字不被截半个,如“我ABC”4,应该截为“我AB”,输入“我ABC汉DEF”,6,应该输出为“我ABC”而不是“我ABC+汉的半个”