时隔三年又重新拾起C语言书学习它,说起来很汗颜。这算是一种补窟窿的行为,但是这次补就一定要补好,加油~
读了这本书的第一章学习了C语言的标准输入输出函数,下面进行以下总结:
一、gets(str) 和puts(str)
gets函数将标准输入中的一行文本读取下来存储在参数数组中。一行输入由一串字符组成,由一个换行符结尾。gets函数丢弃换行符,而是在输入尾补充一个NUL字节(NUL字节是指字节模式为全0的字节,可以理解为'\0')。然后gets函数返回一个非NULL值代表读取成功。
eg.
while(gets(input)!=NULL)
当gets函数被调用但是没有输入行时,它就返回NULL值,表示到达了文件尾。补充:gets函数可能会出现溢出
puts函数将参数中所给的字符串写到标准输出中并在末尾添加一个换行符。
二、getchar()和putchar()
关于getchar函数还真的有点复杂,下面先展示一段代码:
int ch;
while((ch=getchar())!=EOF){
}
起初看起来并没什么,但是仔细看的话会发现ch是一个整型,getchar函数不是接收标准输入中的字符的吗?怎么用一个int类型的来存char类型呢?
来看一下《C和指针》这本书的原文:
答案是EOF是一个整型值,它的位数比字符类型要多,把ch声明为整型可以防止从输入读取的字符意外地被解释为EOF。但同时,这也意味着接受字符的ch必须足够大,足以容纳EOF,这就是ch使用整型值的原因。正如第3章所讨论的那样,字符只是小整型数而已,所以用一个整型变量容纳字符值并不会引起任何问题。
不好意思的说这段话一开始自己并没有读懂,有这么几个疑问:首先EOF是什么,其次getchar这个函数的返回值不是char类型吗,再其次“从输入读取的字符意外地被解释为EOF”这句话又是什么意思?
带着这几个问题浏览查阅了其他人的文章,才算是明白。原文链接是点击打开链接,下面只是自己的体会和总结:
a.EOF简单说就是一个整型常量,它的值是-1,EOF即end of file;
b.getchar函数将接收的字符看做unsigned char 类型,把unsigned char类型转化为int类型返回;
c.unsigned char 的表示范围可以是0~255,255的十六进制表示形式是0XFF,将它转化为int时进行无符号扩展,扩展为32位的int,如果用ch是char类型,那么就需要将getchar函数的返回值再转化为char类型(32位截断为8位)。这里还有一个问题,char类型在不同的编译器上可能是默认unsigned char或者是signed char,于EOF进行比较是还需要扩展为32位int,unsigned char 在位扩时补0,signed char在位扩时补最高位符号位。有符号扩展时那么0XFF 就会扩展为0XFFFFFF,就会与EOF相等了,也就是从输入读取的字符意外地被解释为EOF。并且,如果char默认是无符号的,当getchar的返回值是EOF时,ch!=EOF还总是成立,程序就不能正常结束了。
其实对这个问题最直接最简单的理解就可以是“ch的类型一定要能够存储EOF”,反复思考这个问题自己才能真正想通。
标准输入输出就总结到这里,下面总结下字符串操纵函数吧:
strncpy(str1,str2,n);
strcpy(str1,str2);
strcat(str1,str2);
strchr(str,ch);//在str中查找ch出现的第一个位置
strstr(str1,str2);//在str1中查找str2出现的第一个位置
strcpy和strcat的一个参数都不能是字符串常量,并且前三个函数都要自己确保目标字符串的容量。