The C Programming Language程序研究
前言
C语言之父创作的The C Programming Language一书对于所有学习C语言的人来说都可以算作一部圣经。它不到200页的篇幅却几近完整地阐述了C语言的各个方面,不仅如此,书中的每个例程和练习都展现了作者丰富的C编程经验,对于初学者来说这些例程和练习并不是那么简单,即使是对于有些经验的C语言工作者来说,也有很多值得称道的地方。在此,我特意精选了The C Programming Language (second edition)中几个方面的编程例程和练习作深入的探讨和研究,一方面可以帮助自己巩固已学的知识、提高编程能力,另一方面也可以帮助其他C初学者更好地阅读K&R这部圣经。由于博主自己接触编程不久,因此文章中难免会有错误,还请大家不吝赐教,多多批评指正,谢谢。
声明
1、此博文版权归断絮所有,如需转载请注明出处http://blog.youkuaiyun.com/duanxu_yzc/article/details/12029803,谢谢。
2、在未经博主断絮允许的情况下,任何个人和机构都不得以任何理由出版此文章,否则必将追究法律责任!
第一部分 字符和字符串
K&R这部书中的例程和练习大多都是和字符以及字符串有关的,博主遴选了几类典型的字符(串)处理问题,还对其中的某些进行了修改和扩展。
第一章 字符(串)统计
一、单词计数(p14)
问题描述:统计输入文本中的单词数目。(单词:任何不包含空白字符的连续字符。) 输入:This is a C programme. 输出:5
|
分析
标准输入情况:(用□代表空格,其它不可见字符使用其转义字符表示)
This□is□a
□This□is□a
第一次出现非空白字符时表示已经进入了第一个新单词,程序开始计数,直到遇到空白字符,此时已经读到一个单词之外了,当再次由单词之外进入新单词——出现非空白字符时,再次计数,如此循环,直至文本结束。最后输出统计得到的单词数目。
编码:
/*
* 单词计数
*/
#include <stdio.h>
#include <ctype.h>
#define IN 1 //已经进入一个单词的标志
#define OUT 0 //已经退出一个单词的标志
int main ( void )
{
long int ct; //单词数
int state; //是否进入单词的状态
int ch; //读到的字符
ct = 0L; //初始化单词数为0
state = OUT; //初始状态为不在一个单词中
//读取文本,直到EOF
while ( ( ch = getchar() ) != EOF )
{
if ( isspace ( ch ) ) //切勿使用isblank()函数
state = OUT;
else if ( state == OUT ) //在读到一个非空白字符时,如果前一状态为OUT,则表示进入了一个新单词
{
state = IN; //在新单词内部时,要保持状态为IN
ct ++;
}
}
printf ( "%ld\n", ct );
return 0;
}
关键:如何识别已经进入了一个新单词?
在读到一个非空字符时将状态设置为外(OUT),在一个单词内部时,保持状态为内(IN)。
意外:在编码时,在判断读取是否为空白字符时,意外地使用了错误的isblank()函数,出现了错误的结果。这个函数在C99中有定义,int isblank ( int c );当参数为空格或者水平制表符时,函数返回1,否则返回0;随即测试此函数如下:
/*
* 测试isblank()函数
*/
#include <stdio.h>
#include <ctype.h>
int main ( void )
{
int ch;
int i;
char str[] = " \v\f\r\t\n";
i = 0;
while ( ch = str[i] )
{
if ( isblank ( ch ) )
printf ( "%d\n", i );
i++;
}
return 0;
}
/*
* 输出为 0 4
* 表明只有空格和水平制表符是isblank
*/
扩展:使用枚举类型代替#define常量
/*
* 使用枚举类型替代#include
*/
#include <stdio.h>
#include <ctype.h>
int main ( void )
{
enum state { out, in }; //使用枚举类型
int state; //可以与枚举标签使用同样的名字,这样可以使表达更清楚
int ch;
long int ct;
state = out;
ct = 0L;