1.统计字符数
我们可以利用getchar函数,来进行字符的读入,并对读入的字符进行判断。
EOF:文件结束符,这个特殊值常量与任何实际字符都不相同。
这里我们用int
类型来接收getchar
返回的字符的的原因:为了让变量 c c c能存下EOF
这个常量值。
各种数据类型能表示的数值范围由编译器决定。char
类型在有些编译器中定义的范围为 0 ∼ 255 0 \sim255 0∼255,另外一些编译器中定义的范围为 − 128 ∼ 127 -128 \sim 127 −128∼127。当编译器中定义的范围为 0 ∼ 255 0 \sim 255 0∼255时,用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>#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;}