文档章节

C Primer Plus 第7章 C控制语句:分支和跳转 7.4 一个统计字数的程序

idreamo
 idreamo
发布于 2016/06/18 07:18
字数 905
阅读 57
收藏 0

首先,这个程序应该逐个读取字符,并且应该有些方法判断何时停止;第二,它应该能够识别并统计下列单位:字符、行和单词。下面是伪代码描述:

read a character
while there is more input
    increment character count 
    if a line has been read ,increment line count
    if a word has been read ,increment word count
    read next character

前面已经有输入循环的模型了:

while ((ch=getchar())!=STOP)
{
    ....
}

这里的STOP代表通知输入结束的ch取值。现在我们暂且选择一个在文本中不常见的字符(|)。

现在来考虑一下循环体。因为程序使用getchar()来输入字符,所以可以在每个循环周期通过递增一个计数器的值来统计字符 。为了统计行数,程序可以检查换行符。如果字符 是换行符,程序就递增行数计数器的值。有个问题是如果STOP字符出现在一行的中间该 怎么办?行数计数应不应该增加呢?一种做法是将它作为一个不完整的行统计,也就是说,该行有字符 而没有换行符。可以通过追踪前一个字符来识别这种情况 。如果STOP之前所读入的最后一个字符不是换行符,就计数一个不完整行。

最棘手的部分是识别单词,首先,必须明确定义一个单词意味着什么。让我们以一个相对简单的方法将一个单词定义为不包含空白字符的一系列字符。一个单词以程序首次遇到非空白字符开始,在下一个空白字符出现时结束。使用ctype.h中的isspace( )函数会更简单。如果C是空白字符,isspace(c)为真,如果c不是空白字符!isspace(c)为真。

为了知道一个字符是不是在某单词里,可以在读入一个单词的首字符时把一个标志(命名为inword)设置为1。也可以在此处递增单词的计数。

然后,只要inword保持为1,后续的非空白字符就不标记为一个单词的开始。到出现下一个空白字符时,必须将此标志重置为0,并且程序准备搜索下一个单词。

if c is not whitespace and inword is false
    set inword to true and count the word 
if c is whitespace and inword is true
   set inword to false

这种方法在每个单词开始时将inword设置为1,而在每个单词结束时将其设置为0.仅在该标志从0变为1时对单词计数。

//word.c --统计字符、单词和行
#include <stdio.h>
#include <ctype.h>
#include <stdbool.h>
#define STOP '|'
int main(void)
{
    char c ;    //读入字符
    char prev;  //前一个字符
    long n_chars=0L;  //字符数
    int n_lines=0;    //行数
    int n_words=0;    //单词数
    int p_lines=0;    //不完整的行数
    bool inword=false;  //如果c在一个单词中,则inword等于true

    printf("Enter text to be analyzed(| to terminate): \n");
    prev='\n';    //用于识别完整的行
    while((c=getchar())!=STOP)
    {
        n_chars++;        //统计字符
        if(c=='\n')
            n_lines++;    //统计行数
        if(!isspace(c)&&!inword)
        {
            inword=true;  //开始一个新单词
            n_words++;    //统计单词
        }
        if(isspace(c)&&inword)
            inword=false;  //到达单词尾部
        prev=c;    //保存字字符值
    }
    if(prev!='\n')
        p_lines=1;
    printf("characters=%ld,words=%d,lines=%d,",n_chars,n_words,n_lines);
    printf("partial lines = %d\n",p_lines);
    return 0;
}

 

© 著作权归作者所有

idreamo
粉丝 18
博文 139
码字总数 224743
作品 0
青岛
产品经理
私信 提问
C Primer Plus 第11章 11.7 ctype.h字符函数和字符串

第7章“C控制语句 分支和跳转”介绍了ctype.h系列字符相关的函数。这些函数不能被 应用于整个字符串,但是可以被应用于字符串中的个别字符。程序清单11.26定义了一个函数,它把toupper( )函数...

idreamo
2016/08/27
52
0
C Primer Plus 第7章 C控制语句:分支和跳转 7.1 if语句

这个程序读入一系列每日的最低温度(摄氏度),并报告输入的总数,以及最低温度在零度以下的天数的百分率。在一个循环里使用scanf()读入数值,在每一次循环中增加计数器的值来统计输入数值的...

idreamo
2016/06/13
81
0
C Primer Plus 第7章 C控制语句:分支和跳转 7.3获得逻辑性

假设需要编写一个程序,用来计算在一个输入的句子中,除单引号和双引号以外的字符出现了多少次。可以用逻辑运算符来实现该目的,可以用英文的句号来标识一个句子的结束。 程序清单 7.6 chco...

idreamo
2016/06/17
24
0
C Primer Plus 第7章 C控制语句:分支和跳转 7.2 if语句中添加 else 关键字

if else 语句的通用形式为: if (expression) statement1 else statement2 如果expression为真(非零),就执行statement1;如果expression为假或零,则执行跟在else后的那一条语句(stateme...

idreamo
2016/06/16
46
0
《Java从小白到大牛》之第7章 控制语句

《Java从小白到大牛》纸质版已经上架了!!! 程序设计中的控制语句有三种,即顺序、分支和循环语句。Java程序通过控制语句来管理程序流,完成一定的任务。程序流是由若干个语句组成的,语句...

tony关东升
2018/06/25
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Sqoop之导入Mysql数据到Hive出现ASCII

问题是这样的,从Mysql中导入数据到Hive中,Mysql中数据是"T2",到Hive中后,发现变为"54 32",咦,怎么乱码了,感觉这像ASCII编码。 现象有了,之前都没遇到过这样,觉得很奇怪,迅速找了下...

克虏伯
16分钟前
2
0
深度科技受邀参加鲲鹏计算产业峰会·海南

10月22日,华为及生态伙伴共同举办了以“鲲鹏展翅,力算未来 共赢多样性计算时代”为主题的“鲲鹏计算产业峰会•海南”,来自各领域的300多名行业客户、专家及生态伙伴齐聚一堂,共同分享计算...

后浪涛涛
18分钟前
3
0
【Android JetPack系列】LifeCycles

一、简介 Lifecycles 是一个持有组件生命周期状态(如活动或片段)信息的类,并允许其他对象观察此状态。 生命周期使用两个主要枚举来跟踪其关联组件的生命周期状态: Event:从 框架 和 Li...

Agnes2017
19分钟前
2
0
配置码云git自动更新的webhook

配置项目提交到git的时候自动同步服务器代码 一、在服务器项目跟目录新建文件hook.php 代码如下: 1 2 3 4 5 6 7 8 9 10 11 12 13 <?php $json = file_get_contents("php://input"); $data ......

dragon_tech
25分钟前
2
0
一道题深度剖析this指向

< script > var num = 1 ; var myObject = { num : 2 , add : function (){ this . num = 3 ; ( function (){ // 这里的 this 是 window,因为自调用函数的调用者是windo,使用箭头函数则指向......

李超明
29分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部