上一次的文字把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
下面是我的测试代码:
/* 本程序验证 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; }
暂时就这些内容了。