【第一部分 第一章】The C Programming Language 程序研究 【持续更新】

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.csdn.net/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;
  • 5
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值