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);
}
}
这个代码的复杂度远高于第一个,但是可以解决这个问题,编译结果更为完整严谨。