The C Programming Language(第 2 版) 笔记 / 1 介绍 / 1.5 字符输入/输出 / 1.5.2 字符计数

目录


1.5.2 字符计数

下列程序用于对字符进行计数:

#include 

/* count characters in input; 1st version */ 
main() 
{ 
    long nc; 
    nc = 0; 
    while (getchar() != EOF) 
        ++nc; 
    printf("%ld\n", nc); 
}

换行符也会计数

[vagrant@node01 1.5]$ gcc -o ./out/1.5.2_01_test 1.5.2_01_test.c
[vagrant@node01 1.5]$ ./out/1.5.2_01_test
abc
a
6

++nc; 引入了一个新的运算符 ++,其功能是执行加 1 操作
可以用语句 nc = nc + 1 代替它,但 语句 ++nc 更精炼一些,且通常效率也更高
与该运算符相应的是自减运算符 --
++-- 这两个运算符既可以作为前缀运算符(如:++nc),也可以作为后缀运算符(如:nc++
这两种形式在表达式中具有不同的值,但 ++ncnc++ 都使 nc 的值加 1

该字符计数程序使用 long 类型的变量存放计数值,而没有使用 int 类型的变量
long 整型数(长整型)至少要占用 32 位存储单元
在某些机器上 intlong 类型的长度相同
在另一些机器上 int 类型的值可能只有 16 位存储单元的长度(最大值为 32767
这样,相当小的输入都可能使 int 类型的计数变量溢出
%ld 告诉 printf 函数其对应的参数是 long 整型

使用 double(双精度浮点数)类型可以处理更大的数字:

#include 

/* count characters in input; 2nd version */ 
main() 
{ 
    double nc; 
    for (nc = 0; getchar() != EOF; ++nc) 
        ; 
    printf("%.0f\n", nc); 
}
[vagrant@node01 1.5]$ gcc -o ./out/1.5.2_02_test 1.5.2_02_test.c
[vagrant@node01 1.5]$ ./out/1.5.2_02_test
abc
abcd
9

对于 floatdouble 类型 printf 函数都使用 %f 进行说明
%.0f 强制不打印小数点和小数部分

在该程序段中,for 循环语句的循环体是空的,这是因为所有工作都在测试(条件)部分与增加步长部分完成了
但 C 语言的语法规则要求 for 循环语句必须有一个循环体,因此用单独的分号代替
单独的分号称为空语句,它正好能满足 for 语句的这一要求,把它单独放在一行是为了更加醒目


目录

你可能感兴趣的