C语言处理输入字符的小技巧

        很多年前写的文章了,贴出来给初学C语言的同学一些参考.

        最近看了一点由图灵奖获奖者Dennis M. Ritchie和Brian W.Kernighan两位编写的《C程序设计语言》这本书,看了一下第一章. 

        因为是入门介绍书籍,这本书也不厚,两百多页。但这本书里一直强调的就是一定要不断的编程序实践,它里面的一些题目如果是初次接触C可能觉得有难度,但刚开始不会没关系,可以读懂它里面写的然后自己琢磨自己再修改,这也是一种提高,也可以买配套练习册上面有答案。

        这本书第一章内容介绍了C程序的基本组成,第一章有几个程序很有价值,因此想写点总结来记录一下,顺便加深下理解。另外插句话,因为C是和UNIX操作系统相伴而旦生的,所以这本书里作者也是用了很多在UNIX上的有价值的小程序来介绍C,这些例子短小精悍.

第一个程序题目是这样:编写一个将输入复制到输出的程序,并将基中连续的多个空格用一个空格代替。

        这个题目呢意思是,在键盘上输入字符,然后程序读入输入的字符,输入字符中有超过1个空格地方用1个空格代替,然后输出。下面的两个程序左边是我写的,右边为大师所写:

        随看看一眼就知道左边这个版画本很冗长,不容易读。右边这个很高效,简洁。

        左边将读字符和测试是否结束条件分开了,右边将读字符与测试条件放在了一起,这样看起来很简洁。左边用了三个if语句,右边只用了一个if语句,明显右边的开销要小。且if测试条件里,左边用了两个&&,右边只用了一个||。两者相同的都将程序放在了while循环中执行。        

        从程序逻辑上看,右边的程序一开始将空格标志lastc置为非空字符,然后当程序读到第一个空格字符时,判定条件左边的 c != ' '不成立,但右边 lastc != ' '成立,因此会输出第一个空格,然后下面将c(空格)赋给lastc;程序第二次读到空格时因lastc为空格,表达式 c != ' '|| lastc != ' '为假,因此不输出第二个或更多的空格。当程序为普通字符时,c != ' '就成立, c != ' '|| lastc != ' '就为真(但这时lastc != ' '仍为假),就会输出普通字符,然后下面的lastc = c 会将空格覆盖。

        我写的程序就麻烦多了,也不巧妙。我用了space变量指示空格状态,程序一开始space为0,即没有空格状态。然后前面两个if语句用来处理有空格字符情况。第一个if处理读到第一个空格时,输出空格,并将space改为非0。因此第二次再读到空格或更多会在第二个if中执行(对本程序而言,其实第二个if中space++是不必要哈,反而space++能记录到程序结束后空格的个数),然后如果是普通字符就执行输出,并将space置0,表示连续空格状态结束。顺便说下,如果要让space记录空格个数,要将它的值用另一个变量保存起来,因为在else里会将space清空。程序执行截图:

        

第二个程序:编写统计行数,单词数与字符数的程序:

        

        这个程序也很经典,主要在对单词个数的处理上。这个是大师写的,用了一个整型变理来记录当前读入字符的状态,初始化时为0,表示在单词外,一旦读入一个普通字符(不为空格,换行符,制表符)时,单词个数加1。然后以读入空格,换行符,制表符为单词结束标志,将state置0。以下为程序执行截图:

        多年前的文章,仅给C语言初学者一点参考.错误在所难免,自行甄别.

        任何技术的学习,独立思考最重要,别人写得再好,那是别人掌握的技术,不是自已的.自己的写得再烂,那也是自己的技术.一定要有自己的见解和想法,要原创,然后在此基础之上如果别人的更好则吸收再改进.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值