c语言 字数统计 字符串,基于C语言的字数统计

摘要:字数统计是文档处理中经常要用到的功能,这其中要包括英文单词、数字和中文等,而且又要和全角或半角的标点符号进行区分,故此在中英文混合文件中进行准确的字数统计也是有一定难度的。这里提出了一种较好的字数统计的方法,可以很好的区分出英文单词、数字和汉字,并以C语言为工具进行了实现。

关键词:字数统计;汉字;标点符号;C语言;实现

中图分类号:TP312文献标识码:A文章编号:1009-3044(2008)34-2028-02

Word Statistics Based on C

TANG Xiao-le

(Dept. of Computer, Henan Industry & Trade Vocational College, Zhengzhou 450012, China)

Abstract: Word statistics is a kind of function which is usually used and it includes English words, digits and Chinese characters, what’s more, it must discriminate single byte punctuation marks from double byte punctuation marks. So it is of some difficulty when counting words accurately in compound files. A method is presented to count word which can separate English words, digits and Chinese words and is realized based on C language.

Key words:word statistics; Chinese character; punctuation marks; C language; realization

1 引言

ASCII是用来表示英文字符的一种编码规范,每个ASCII字符占用1个字节(8bits)。因此,ASCII编码可以表示的最大字符数是256,其实英文字符并没有那么多,一般只用前128个(最高位为0),其中包括了控制字符、数字、大小写字母和其他一些符号。

中文的文字编码规范叫做“GB2312-80”,它是和ASCII兼容的一种编码规范,其实就是把一个中文字符用两个扩展ASCII字符来表示。我们必须判断一个ASCII码是否扩展,以及它的下一个ASCII是否扩展,然后才“猜”那可能是一个中文字符。而由于汉字和全角字符都是用两个扩展ASCII字符来表示,所以还需进一步加以区分。这样统计中英文混合文件中的字数,也是比较复杂的,有些软件也不尽准确,如微软Office组件中的Word在对中文字数统计时会把中文的标点符号也计算在内。

2 基于C语言的字数统计

本文用C语言来大致描述出如何通过编程来实现字数统计功能。均假设从test.txt文件中得到输入。所用到的文件指针如下:

FILE *fp;

// 打开文件

if((fp = fopen("c:\\test.txt", "r")) == NULL)

{

printf("Can't open file.");

exit(1);

}

2.1 英文单词的统计

对英文单词进行统计时,需要考虑它们的ASCII码即可,主要要分清哪个字符标识着单词的开始或结束,如单词hello,一旦访问到字符h就表明进入单词内部,直到遇到单词分隔符如空格、回车等时认为该单词结束,将单词数加一。简要代码如下:

void countEn(FILE *fp, int *num_e)

{

int word_e = 0; // 英文单词开始时设置 0 标记,即在单词外部

char ch;

while((ch = fgetc(fp)) != EOF)

{

// 判断是否为字母

if(((ch >= 'a' && ch = 'A' && ch

{

(*num_e)++;

word_e = 1; // 置1表明在单词内部

}

// 如果既不是字母又不是数字,而且也不小于0的话,即也不是中文字符的话,

// 就视为分隔符

else if((ch > 0 && ch < 48) || (ch > 57 && ch < 65)

|| (ch > 90 && ch < 97) || (ch > 122 && ch < 128))

word_e = 0; // 表明在单词外部

}}

2.2 数字的统计

对数字进行统计时,也需要考虑它们的ASCII码,要分清哪个字符标识着数字的开始或结束,如1000,一旦访问到字符1就表明进入数字内部,直到遇到分隔符如空格、回车等时认为该数字结束,将数字数目加一。由于可能存在小数,如10.01,如果遇到“.”,还需要判断它的下一个字符是不是为数字,如果不是则这个数字才被认为结束。简要代码如下:

void countDigit(FILE *fp, int *num_d)

{

int word_d = 0;//数字开始时设置 0 标记,如1000,即在数字外部

char ch;

while((ch = fgetc(fp)) != EOF)

{

if((ch >= '0' && ch

{

(*num_d)++;

word_d = 1;

}

// 如果既不是字母又不是数字,而且也不小于0的话,就视为分隔符

else if((ch > 0 && ch < 46) || ch == 47 || (ch > 57 && ch < 65)

|| (ch > 90 && ch < 97) || (ch > 122 && ch < 128))

word_d = 0;

}

// 把小数点看成数的一部分,如1.55,“.”的ASCII码值为46

else if(ch == 46 )

{

ch = fgetc(fp);

// 如果“.”之后不再为数字,则认为数字结束,将word_d置为0

if(!((ch >= '0' && ch

word_d = 0;

}}}

2.3 汉字的统计

由于汉字由两个字节来描述,其内码范围为 B0A0~F7A0,而中文标点符号内码的高字节为A1,所以只要区分高字节的不同,就可以区分开汉字和标点了。也就是说,如果一个字节大于B0,则意味着有可能是中文汉字,如果下一字节仍然大于A0,那么这必然是一个汉字,字数加一,否则不予处理。直到文件读取结束。简要代码如下:

void countCN(FILE *fp, int *num_c)

{

char ch;

while((ch = fgetc(fp)) != EOF)

{

// 汉字的内码范围为 B0A0~F7A0

if(ch < 0)

{

if(((int)ch & 0xff) >= 0xB0)

{

ch = fgetc(fp);

if(((int)ch & 0xff) >= 0xA0)

(*num_c)++;

}

// 直接读入汉字的第二个字节

else

ch = fgetc(fp);

}}}

3 结论

对文档进行字数统计,这在很多场合下均有应用,而由于中英文编码的不同,统计混合文件中的字数也是比较复杂的,本文的方法具有较好的健壮性,可以用任何一种编程语言实现或者移植到其它应用程序当中。

参考文献:

[1] 吴征.在Delphi中实现中英文字数统计[J].电脑迷,2004(3):72.

[2] 于鸿霞.统计与规则相结合的中英文组块分析[D].哈尔滨:哈尔滨工业大学,2006.

[3] 李德明.计算机汉字内码评析[J].印刷杂志,1997(5).

你可能感兴趣的:(c语言,字数统计,字符串)