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 语句控制了包含在花括号内的两条语句。


猜你喜欢
- Java进阶之FileUpload完成上传的实例 FileUpload是Apache commons下面
- 需要引入命名空间:using System;using System.Text;解码: public static string
- Maven是项目对象模型(POM),可以通过一小段描述信息来管理项目的构建,报告和文档的项目管理工具软件。Maven是一个项目管理工具,它包
- 前言在上篇文章《初识GraphQL》中我们大致的了解了GraphQL作用,并通过简单示例初步体验了GraphQL的使用。下面我们从Hello
- 环境:apache-tomcat-8.5.15jdk1.8.0_172IDEA建立一个maven-webapp项目:Create New P
- 前言本文主要给大家介绍了关于C#中foreach遍历的用法以及c#使用foreach需要知道的一些事,分享出来供大家参考学习,下面话不多说了
- Spring Boot应用内存飙升一个简单的Spring Boot应用, 几乎只有一个用户在用,内存竟然达到1.2G, 可怕服务现状由于之前
- 1 SeekBar简介SeekBar是进度条。我们使用进度条时,可以使用系统默认的进度条;也可以自定义进度条的图片和滑块图片等。2 Seek
- 由于最近通过SDK-Manager更新了build-tools,当要用到dx.jar这个包时,自动调用最新build-tools中dx.ja
- Android仿微信activity滑动关闭功能1.利用具体利用v4包下的slidingPaneLayout实现透明的activity,代码
- 在开源中国看到的操作ini文件的,写的还不看,留着以后用using System;using System.IO;using System.
- 前言大家应该都有所体会,在android开发中,需要展示图片的地方有很多..正常情况下展示一张图片的时候还需要在下面添加一个文字说明..我们
- 本文实例为大家分享了java实现滑动验证解锁的具体代码,供大家参考,具体内容如下1.html:<div class="dra
- 格式要求:SU MO TU WE TH FR SA &nb
- 在开始本文前先考虑以下一个问题在不使用任何带有自动补全功能IDE的情况下,如何获取一个数组的长度?以及,如何获取一个字符串的长度?这个问题我
- Java中存在着两种Random函数:java.lang.Math.Random;调用这个Math.Random()函数能够返回带正号的do
- 本文实例讲述了Android开发之FloatingActionButton悬浮按钮基本使用、字体、颜色用法。分享给大家供大家参考,具体如下:
- 背景最近对于 Java 多线程做了一段时间的学习,笔者一直认为,学习东西就是要应用到实际的业务需求中的。否则要么无法深入理解,要么硬生生地套
- 前言在阅读Kotlin的代码时,经常有看到 :: 这个符号,这个符号专业术语叫做成员引用,在代码中使用可以简化代码,那到底怎么使用呢以及使用
- 布局中listview要覆盖标题栏 int mTouchSlop = ViewConfiguration.get(this).getScal