1.统计字符数
我们可以利用getchar函数,来进行字符的读入,并对读入的字符进行判断。
EOF:文件结束符,这个特殊值常量与任何实际字符都不相同。
这里我们用int
类型来接收getchar
返回的字符的的原因:为了让变量
能存下EOF
这个常量值。
各种数据类型能表示的数值范围由编译器决定。char
类型在有些编译器中定义的范围为
,另外一些编译器中定义的范围为
。当编译器中定义的范围为
时,用char接收getchar()返回值时就会出错。数据类型具体的定义范围可在<limits.h>
文件中找到。
#include <stdio.h>
int main(void)
{
int c;
int cnt = 0;
while(getchar() != EOF)
++cnt;
printf("%d\n", cnt);
return 0;
}
2.统计行数
我们可以用\n
一行的结束,所以代码如下:
#include <stdio.h>
int main(void)
{
int c;
int cnt = 0;
while(((c = getchar()) != EOF)
if(c == '\n')
++cnt;
printf("%d\n", cnt);
return 0;
}
3.统计单词数
根据观察普通文本,有以下五种情况我们需要考虑:
注:空白字符包括(空格、换行符(\n)、制表符(\t))
- 读到了一个非空白字符,且后面仍有非空白字符
- 读到了一个非空白字符,且后面为空白字符
- 读到了一个空白字符,后面是一个非空白字符
- 读到了一个空白字符,后面仍然是空白字符
- 读到了文件结束符
根据上述情况,我们对统计单词数程序的具体程序如下:
- 处理空白字符
- 处理连续非空白字符
- 处理换行符和文件结束符
#include <stdio.h>
int main(void)
{
#include <stdio.h>
#define IN 1 /* 在单词内 */
#define OUT 0 /* 在单词外 */
int main(void)
{
int c, nl, nw, nc, state;
state = OUT;
nl = nw = nc = 0;
while((c = getchar()) != EOF) {
++nc;
if(c == '\n') ++nl;
if(c == ' ' || c == '\n' || c == '\t') state = OUT;
else if(state == OUT) { // 从单词外进入单词内就把单词数加一
state = IN;
++nw;
}
}
printf("单词数:%d, 行数:%d, 字符数:%d\n", nw, nl, nc);
return 0;
}
}