C语言习题集
1.6 验证表达式getchar() != EOF的值是0还是1。
1 int main()
2 {
3 int c;
4
5 while(c = getchar() != EOF){
6 printf("%d\n",c);
7 }
8 return 0;
9 }
一个优先级的小问题,因为!=的优先级要高于=,所以原式等价于c = (getchar() != EOF),从系统的标准输入读取字符并使用了这个表达式。当有字符可读时,getchar()不会返回文件结束符(即EOF),所以getchar() != EOF的取值为真,c将会被赋值为1。当程序遇到文件结束符时,取值为假,c将被赋值为0,程序将结束运行。
1.7 编写一个打印EOF值的程序。
1 int main()
2 {
3 printf("EOF is %d\n",EOF);
4 return 0;
5 }
因为在<stdio.h>里面宏定义的EOF是-1,所以打印的结果是-1,但我改了<stdio.h>里面的定义值之后输出的结果仍然是-1我就不是很懂了。比较浅显的理解是在windows操作系统下按ctrl+z即可代表EOF.
1.8 编写一个统计空格、制表符与换行符个数的程序。
1 /* count blanks,tabs,and newlins */
2 int main()
3 {
4 int c,nb,nt,nl;
5 nb = 0; /* number of blanks */
6 nt = 0; /* number of tabs */
7 nl = 0; /* number of newlines */
8
9 while((c=getchar()) != EOF){
10 if(c == ' ') ++nb;
11 if(c == '\t') ++nt;
12 if(c == '\n') ++nl;
13 }
14 printf("%d %d %d\n",nb,nt,nl);
15 return 0;
16 }
1.9 编写一个将输入复制到输出的程序,并将其中连续的多个空格用一个空格代替。
int main() { int c,nb; nb = 0; while((c = getchar()) != EOF){ if(c == ' ') nb++; else nb = 0; if( nb == 0 || nb == 1) putchar(c); else ; } return 0; }
比较朴素的想法,一旦出现空格就对其进行计数,当不是空格或者只有一个空格时,照样输出,当有两个或以上空格时什么都不做也就是舍弃。
再看看另一种写法:
#define NONBLANK 'a' /* replace string of blanks with a single blank */ int main() { int c,lastc; lastc = NONBLANK; while((c = getchar()) != EOF){ if(c != ' ') putchar(c); if( c == ' ') if (lastc != ' ') putchar(c); lastc = c; } return 0; }
用整型变量 c 记录当前输入字符,用 lastc 记录上一个输入字符,如果 c 不为空格是照常输出,如果 c 为空格而 lastc 不为空格,也是照常输出,只有当 c 是空格,而且 lastc 也是空格时什么都不干,也就是舍弃。读程序的时候应该注意一下结构 lastc = c 这条刷新语句不在任何 if 之列,每次都会执行。 这个程序可以简化,两个 if 就可以搞定一个 if也是可以搞定的。至于两个版本的程序谁更好,我暂时不知道,呵呵,水平有限。