C语言编程中统计输入的行数以及单词个数的方法
作者:goldensun 发布时间:2021-06-08 10:49:31
统计输入的行数
标准库保证输入文本流以行序列的形式出现,每一行均以换行符结束。因此,统计行数等价于统计换行符的个数。
#include <stdio.h>
/* count lines in input */
main()
{
int c, nl;
nl = 0;
while ((c = getchar()) != EOF)
if (c == '\n')
++nl;
printf("%d\n", nl);
}
在该程序中,while 循环语句的循环体是一个 if 语句,它控制自增语句++nl。if 语句先测试圆括号中的条件,如果该条件为真,则执行其后的语句(或括在花括号中的一组语句)。这里再次用缩进方式表明语句之间的控制关系。
双等于号==是 C 语言中表示“等于”关系的运算符(类似于 Pascal 中的单等于号=及 Fortran 中的.EQ.)。由于 C 语言将单等于号=作为赋值运算符,因此使用双等于号==表示相等的逻辑关系,以示区分。这里提醒注意,在表示“等于”逻辑关系的时候(应该用==),C 语言初学者有时会错误地写成单等于号=。在后面我们将看到,即使这样误用了,其结果通常仍然是合法的表达式,因此系统不会给出警告信息。
单引号中的字符表示一个整型值,该值等于此字符在机器字符集中对应的数值,我们称之为字符常量。但是,它只不过是小的整型数的另一种写法而已。例如,'A'是一个字符常量;在 ASCII 字符集中其值为 65(即字符 A 的内部表示值为 65)。当然,用'A'要比用 65 好,因为。'A'的意义更清楚,且与特定的字符集无关。
字符串常量中使用的转义字符序列也是合法的字符常量,比如,'\n'代表换行符的值,在 ASCII 字符集中其值为 10。我们应当注意到,'\n'是单个字符,在表达式中它不过是一个整型数而已;而"\n"是一个仅包含一个字符的字符串常量。
下面编写一个统计空格、制表符与换行符个数的程序。
#include <stdio.h>
main()
{
/* blanks, tabs, and newlines */
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);
}
统计输入的单词个数
这里对单词的定义比较宽松,它是任何其中不包含空格、制表符或换行符的字符序列。下面这段程序是 UNIX 系统中 wc 程序的骨干部分:
#include <stdio.h>
#define IN 1 /* inside a word */
#define OUT 0 /* outside a word */
/* count lines, words, and characters in input */
main()
{
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", nl, nw, nc);
}
程序执行时,每当遇到单词的第一个字符,它就作为一个新单词加以统计。state 变量记录程序当前是否正位于一个单词之中,它的初值是“不在单词中”,即初值被赋为 OUT。我们在这里使用了符号常量 IN 与 OUT,而没有使用其对应的数值 1 与 0,这样程序更易读。在较小的程序中,这种做法也许看不出有什么优势,但在较大的程序中,如果从一开始就这样做,因此而增加的一点工作量与提高程序可读性带来的好处相比是值得的。读者也会发现,如果程序中的幻数都以符号常量的形式出现,对程序进行大量修改就会相对容易得多。
下列语句 nl = nw = nc = 0; 将把其中的 3 个变量 nl、nw 与 nc 都设置为 0。这种用法很常见,但要注意这样一个事实:在兼有值与赋值两种功能的表达式中,赋值结合次序是由右至左。所以上面这条语句等同于 n1 = (nw = (nc = 0));
运算符||代表 OR(逻辑或),所以下列语句 if (c == ' ' || c== '\n' || c == '\t') 的意义是“如果 c 是空格,或 c 是换行符,或 c 是制表符”(前面讲过,转义字符序列\t 是制表符的可见表示形式)。相应地,运算符&&代表 AND(逻辑与),它仅比||高一个优先级。由&&或||连接的表达式由左至右求值,并保证在求值过程中只要能够判断最终的结果为真或假,求值就立即终止。如果 c 是空格,则没有必要再测试它是否为换行符或制表符,这样就不必执行后面两个测试。在这里,这一点并不特别重要,但在某些更复杂的情况下这样做就有必要了,不久我们将会看到这种例子。
这段程序中还包括一个 else 部分,它指定当 if 语句中的条件部分为假时所要执行的动作。其一般形式为:
if (表述式)
语句 1
else
语句 2
其中,if-else 中的两条语句有且仅有一条语句被执行。如果表达式的值为真,则执行语句 1,否则执行语句 2。这两条语句都既可以是单条语句,也可以是括在花括号内的语句序列。在单词计数程序中,else 之后的语句仍是一个 if 语句,该 if 语句控制了包含在花括号内的两条语句。
猜你喜欢
- 接口隔离原则(ISP)定义:使用多个专门的接口比使用单一的总接口要好。即不要把鸡蛋都放到一个篮子里。好处:比较灵活、方便,不想实现的或不用实
- 前言说起网络爬虫,大家想起的估计都是 Python ,诚然爬虫已经是 Python 的代名词之一,相比 Java 来说就要逊色不少。有不少人
- 一、前序遍历1.题目描述给你二叉树的根节点 root ,返回它节点值的 前序 遍历。2.输入输出示例示例 1:输入:root = [1,nu
- 使用java基础类写的一个简单的zip压缩解压工具类package sun.net.helper;import java.io.*;impo
- 组合模式是一种常见的设计模式(但我感觉有点复杂)也叫合成模式,有时又叫做部分-整体模式,主要是用来描述部分与整体的关系。个人理解:组合模式就
- //计算字符串的MD5值 public string G
- 前言:在java的网络通信中,两个不同节点的主机想要进行通信则可以通过建立Socket对象(相当于客户端主机,向服务端请求发送信息)和Ser
- 本文介绍 Spring Boot 项目中整合 ElasticSearch 并实现 CRUD 操作,包括分页、滚动等功能。之前在公司使用 ES
- 写本文章的目的是为了记录工作中遇到的问题,方便以后遇到可以迅速解决问题我使用的NPOI版本是2.2.1.0版本需要用到的命名空间using
- 我object != null要避免很多NullPointerException。有什么替代方法:if (someobject != nul
- 本文实例讲述了C#读取目录下所有指定类型文件的方法。分享给大家供大家参考。具体分析如下:首先要引入命名空间:using System.IO;
- 大多数浏览器会对同一域名的请求限制请求数量,一般是在8个以内。每次最多可以同时请求8个,要是资源多于8个,那么剩下的就要排队等待请求了。所以
- 本文实例讲述了C#使用iTextSharp将PDF转成文本的方法。分享给大家供大家参考。具体实现方法如下:using System;usin
- MongoDB是介于关系数据库和非关系数据库之间的一种产品,文件的存储格式为BSON(一种JSON的扩展),这里就主要介绍Java通过使用m
- 在使用EL时,其实EL是先看标识符是否是其隐式对象之一,如果不是,才从四个域(page、request、session、applicatio
- 前言Spring常见的创建bean实例的方式有:1.通过bean的class属性创建实例 无参构造器带参构造器2.工厂方法静态工厂
- final可以修饰类 ,成员变量,局部变量和方法。1.final修饰成员变量1.final成员变量的初始化对于final修饰的变量,系统不会
- 前言前面几篇我们学习的都是单表查询,就是对一张表中的数据进行查询。而实际项目中,基本都会有多张表联合查询的情况,今天我们就来了解下JPA的联
- 免责声明:本教程所有资源均来源于网络;仅用于学习交流,请勿用于任何商业行为;如需要,请使用正版授权;侵权联删。推荐最新 IntelliJ I
- 本文实例讲述了C#多线程学习之使用定时器进行多线程的自动管理。分享给大家供大家参考。具体分析如下:Timer类:设置一个定时器,定时执行用户