【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;
}

  暂时就这些内容了。

原文地址:https://www.cnblogs.com/volcanol/p/3013363.html