C程序设计语言(第2版)练习1-11 你准备如何测试单词计数程序?如果在程序中存在某种错误,那么什么样的输入最可能发现这类错误呢? 1-12 编写一个程序,以每行一个单词的形式打印其输入

1-11 你准备如何测试单词计数程序?如果在程序中存在某种错误,那么什么样的输入最可能发现这类错误呢?

这一问是一个开放题,以思考如何测试程序的正确性,最好的当然是包含换行、制表符和空格的内容,然后观察输出的结果,如果正确的话,基本就没啥问题;错误的话,再根据结果去修改代码。

1-12 编写一个程序,以每行一个单词的形式打印其输入

一开始我编了这一段程序,还觉得实在是太简单了。

#include<stdio.h>

int main()
{
	int c;

	while ((c = getchar()) != EOF)
	{
		if (c == ' ' || c == '\t' || c == '\n')
			printf("\n");
		else putchar(c);
	}

}

然后发现这段程序存在一个问题,就是当制表符和空格连续出现的时候,就会生成空行,这一问题困扰我许久,暂时没想出修改方案。

根据教材作者的思路,应该是用“单词内与单词外”的思路去编程,于是我编了第二段程序以解决这一问题。

#include <stdio.h>

#define IN 1 /*inside a word*/
#define OUT 0 /*outside a word*/


int main()
{
	int c, state;
 
	state = OUT;
	while ((c = getchar()) != EOF)
	{
		if (c == ' ' || c == '\n' || c == '\t')
        {
			if (state == IN)
			{
				putchar('\n'); 
				state = OUT;
			}
		}else if (state == OUT) 
              {
				state = IN; 
				putchar(c);
		      }
			else putchar(c);
	 }
}

这个代码的复杂度远高于第一个,但是可以解决这个问题,编译结果更为完整严谨。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值