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也是可以搞定的。至于两个版本的程序谁更好,我暂时不知道,呵呵,水平有限。

posted on 2010-10-08 15:47  zxl2431  阅读(476)  评论(0编辑  收藏  举报

导航