zoukankan      html  css  js  c++  java
  • 【C语言学习趣事】_30_《C程序设计语言》_Secnod_Edition_习题

      上一次的文字把Hello world程序说了一点,今天继续就习题说道说道。

    【1.5  字符输入/输出】

      K&R的C书里面说过一段话:

          1、标准输入输出库的输出模型: 无论文本从何处输入和输出,其输入和输出都是按照字符流处理。

      2、文本流:文本流是由零行或者多行字符构成的字符序列,而每行文字则是由零个字符或者多个字符组成;而不管有没有字符,行末尾则是一个

    换行符。

      标准库的输入和输出函数都按照这个规则处理。

    (1)回显输入的内容

      

      我的测试代码,如上所示,测试情况如下所示,

      

      这里有个问题,如果利用上面的代码我们如何输入  EOF  字符呢?   

      如上面的运行结果是:Ctrl + Z 的运行结果。在Linux中利用 Ctrl + D 模拟表示输入结束。

      但是是否是所有的情况下输入 Ctrl + D  都能跳出循环呢?我看未必,在输入的情况下需要分清楚情况。

    【习题1.6】

      编写程序验证 getchar() != EOF 的值是1还是0.

      上面提到过EOF的输入时有条件的,不同的操作系统具有不同的处理方式:

          Linux:

         1、在Linux中,如果在一行的最开始输入:Ctrl  + D,则表示输入EOF字符

            2、在Linux中,如果在一行的最后输入:Ctrl + D ,则表示本行输入结束,需要再输入:Ctrl + D 才表示EOF

           Windows:

        在Windows中,也大体若是,但是输入的组合键不一样,

            1、在Windows中,如果在一行的最开始输入:Ctrl + Z ,则表示输入EOF字符

            下面是园子里的一篇新闻的描述:http://news.cnblogs.com/n/121416/

       下面是维基百科的说法:http://zh.wikipedia.org/wiki/EOF

             下面是我的测试代码:

    View Code
    /*
    本程序验证 getchar() != EOF 的值是 1 还是 0
    */
    
    #include <stdio.h>
    
    int main(int argc,char* argv[],char* env[])
    {
        short int chInput;
        while(1)
        {
            if(getchar()!=EOF)
            {
                putchar('1');
                break;
            }
            else
                putchar('0');
        }
    
        getch(stdin);
        return 0;
    
    }

    【习题1.7】

      编写一个打印EOF值的程序,在Windows下我用VS2008测试的时候,发现EOF的定义是在<stdio.h>头文件中定义,如下所示:

      这里 EOF 的定义是 -1 ;

      测试代码是:

    /*
        本程序打印EOF的值
    */
    
    #include <stdio.h>
    
    int main(int argc,char* argv[],char* env)
    {
        printf("EOF = %d",EOF);
    
        getc(stdin);
    
        return 0;
    }

    【习题1.8】

      编写一个统计空格、制表符和换行符的程序。

      这里我们需要知道的是:空格、制表符和换行符对应的ASCII码即可,当然我们可以字符来表示。

    /*
        本程序用来统计空格、制表符和换行符的个数
    */
    
    #include <stdio.h>
    
    
    int main(int argc,char* argv[])
    {
        unsigned int nSpace,
                     nTab,
                     nNewLine;
        int chInput;
    
        nSpace=0;
        nTab=0;
        nNewLine=0;
        
        while(EOF != (chInput=getchar()))
        {
            switch(chInput)
            {
            case '\n':
                ++nNewLine;
                break;
            case '\t':
                ++nTab;
                break;
            case '\x20':
                ++nSpace;
            }
        }
    
        printf("Space: %d\n",nSpace);
        printf("Tab: %d\n",nTab);
        printf("NewLine: %d",nNewLine);
    
        return 0;
    }

      代码中我没有用字符 ' ' 来表示空格,而用了 '\x20' 是为了强调空格也是个字符,因为有人可能将‘\0' 和一些非显示字符不当作字符看待。

    【习题1.9】

      

       我的代码如下所示:

    /*
        本程序用来回显输入,并将连续的多个空格用一个空格替代    
    */
    
    #include <stdio.h>
    
    #define YES 1
    #define NO 0
    
    int main(int argc,char* argv[])
    {
        short int MultiSpace; //如果有一个空格就将MultiSpace设置为1
        short int chInput;
    
     
        while(EOF != (chInput=getchar()))
        {
            if('\x20' == chInput)
            {   
                MultiSpace=YES;
                continue;   //如果是空格的话,就继续读取下一个字符
            }
            else 
            {   
                if(YES==MultiSpace)
                {
                    putchar('\x20');
                    MultiSpace=NO;
                }
                putchar(chInput);
            }
        }
    
        return 0;
    }

      暂时就这些内容了。

  • 相关阅读:
    ELK+Kafka集群日志分析系统
    Centos 6.5 部署 redmine 3.3
    Centos 6.5 搭建l2tp 服务端和客户端
    Logstash之multiline 插件
    MYSQL MHA
    windows上给yii2安装插件
    YII2框架的安装
    Apache服务器配置项和虚拟机配置
    浮点数的比较
    微信自定义菜单总结
  • 原文地址:https://www.cnblogs.com/volcanol/p/3013363.html
Copyright © 2011-2022 走看看