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

你可能感兴趣的:(C语言)