C 程序设计:行计数
2010-02-17
问题:编写程序统计输入中的行数。
标准库保证输入文本流以行序列的形式出现,每一行均以换行符结束。所以,统计行数等价于统计换行符的个数。
#include <stdio.h>
/* 统计输入中的行数 */
main()
{
int c, n1;
n1 = 0;
while((c = getchar()) != EOF)
if(c == '\n')
++n1;
printf("%d\n", n1);
}
单引号中的字符表示一个整型值,该值等于此字符在机器字符集中对应的数值,称为字符常量。双引号里的则是字符串,比如 "\n" 表示换行,而 '\n' 则表示单个字符,它在 ASCII 字符集中的值为 10。
同样,我们可以解决更多同类问题。
问题:统计空格、制表符、换行符的个数
#include <stdio.h>
/* 统计空格、制表符与换行符个数 */
main()
{
int c, nb, nt, nl;
nb = 0;
nt = 0;
nl = 0;
while((c = getchar()) != EOF)
{
if(c == ' ')
++nb;
if(c == '\t')
++nt;
if(c == '\n')
++nl;
}
printf("%d %d %d\n", nb, nt, nl);
}
整型变量 nb, nt, nl 分别用来统计空格、制表符和换行符的个数。
问题:编写一个将输入复制到输出的程序,并且将其中连续多个空格用一个空格代替。
#include <stdio.h>
#define NONBLANK 'a'
main()
{
int c, lastc;
lastc = NONBLANK;
while((c = getchar()) != EOF)
{
if(c != ' ' || lastc != ' ')
putchar(c);
lastc = c;
}
}
运行结果如下图所示:

整型变量 c 负责记录当前输入字符的 ASCII 值,而 lastc 则记录前一个输入字符的 ASCII 值。符号常量 NONBLANK 负责把变量 lastc 初始化为一个任意的非空格字符。
程序的逻辑设计如下:
- 如果当前字符 c 和前一个字符 lastc 都不是空格,那么当然可以把 c 输出;
- 当前的字符 c 不是空格,但是前一个字符 lastc 是空格,这种情况也可以输出 c;
- 当前的字符 c 是空格,但是前一个字符 lastc 不是空格,这种情况就输出空格了;
- 只有一种情况下,是不能将 c 输出的,那就是当前字符 c 已经是空格了,但是前一个字符还是空格,那么就不能将当前字符 c (即第二个空格)输出。
