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

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

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

read a character
while there is more inputincrement character count if a line has been read ,increment line countif a word has been read ,increment word countread 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 falseset inword to true and count the word 
if c is whitespace and inword is trueset 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等于trueprintf("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;
}

 

转载于:https://my.oschina.net/idreamo/blog/693719

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/458350.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

收集整理的非常有用的PHP函数

为什么80%的码农都做不了架构师&#xff1f;>>> 1、PHP加密解密 2、PHP生成随机字符串 3、PHP获取文件扩展名&#xff08;后缀&#xff09; 4、PHP获取文件大小并格式化 5、PHP替换标签字符 6、PHP列出目录下的文件名 7、PHP获取当前页面URL 8、PHP强制下载文件 9、…

进程间的通信方式——pipe(管道)

from&#xff1a;https://blog.csdn.net/skyroben/article/details/715133851.进程间通信每个进程各自有不同的用户地址空间,任何一个进程的全局变量在另一个进程中都看不到&#xff0c;所以进程之间要交换数据必须通过内核,在内核中开辟一块缓冲区,进程A把数据从用户空间拷到内…

highcharts 显示网格

2019独角兽企业重金招聘Python工程师标准>>> xAxis: { gridLineColor: #197F07, gridLineWidth: 1 }, yAxis: { gridLineColor: #197F07, gridLineWidth: 2 }, 转载于:https://my.oschina.net/LingBlog/blog/697885

Cheat—— 给Linux初学者和管理员一个终极命令行备忘单

编译自&#xff1a;http://www.tecmint.com/cheat-command-line-cheat-sheet-for-linux-users/作者&#xff1a; Avishek Kumar原创&#xff1a;LCTT https://linux.cn/article-3760-1.html译者&#xff1a; su-kaiyao原文稍有改动 当你不确定你所运行的命令&#xff0c;尤其是…

云数据库·ApsaraDB 产品6月刊

【重点关注】RDS发布新规格 RDS于5月下旬发布新产品规格&#xff0c;新规格对齐ECS配置:1.连接数大幅提升 互联网型的应用特点是发展快速&#xff0c;在云上应用层会基于VM进行横向扩展&#xff0c;对数据库的要求除了资…

Qt Console Application 与 Qt GUI Application互转

在桌面开发中&#xff0c;总的来说&#xff0c;包含两种类型的应用程序&#xff1a;无界面的Console程序和有界面的GUI程序。Qt也不例外&#xff0c;包含Qt Console Application和Qt GUI Application。一、Qt Console Application在VS2015中创建一个Qt Console Application&…

Create Volume 操作(Part I) - 每天5分钟玩转 OpenStack(50)

2019独角兽企业重金招聘Python工程师标准>>> 前面已经学习了 Cinder 的架构和相关组件&#xff0c;从本节我们开始详细分析 Cinder 的各种操作&#xff0c;首先讨论 Cinder 如何创建 volume。 Create 操作流程如下&#xff1a; 客户&#xff08;可以是 OpenStack 最…

【VMCloud云平台】拥抱Docker(六)关于DockerFile(1)

之前我们说过通过Docker pull来下载Images创建容器&#xff0c;这一次我们来聊下如何通过DockerFile创建Images再创建容器&#xff0c;Dockerfile也是Docker中的重点&#xff0c;使用DockerFile能够更加便捷轻量的存储标准化环境&#xff0c;也是环境管理的重要手段&#xff0c…

Windows系统编程之进程间通信

Windows系统编程之进程间通信作者&#xff1a;北极星2003来源&#xff1a;看雪论坛&#xff08;www.pediy.com&#xff09;Windows 的IPC&#xff08;进程间通信&#xff09;机制主要是异步管道和命名管道。&#xff08;至于其他的IPC方式&#xff0c;例如内存映射、邮槽等这里…

20分钟快速了解Redis

Redis可以说是目前最火爆的NoSQL数据库&#xff01; 过去几年&#xff0c;Memcached很盛行&#xff0c;现在有很多公司已将Memcached替换成了Redis。当然&#xff0c;很多人替换并不清楚为什么&#xff0c;只是感觉不想让主流抛弃&#xff0c;这也充分反映了目前Redis的强势。 …

进程通信例子

from&#xff1a;https://msdn.microsoft.com/zh-cn/library/system.diagnostics.process.beginoutputreadline(vvs.80).aspx?cs-save-lang1&cs-langcsharp#code-snippet-4备注可同步或异步读取 StandardOutput 流。Read、ReadLine 和 ReadToEnd 等方法对进程的输出流执行…

IDEA15 下运行Scala遇到问题以及解决办法

为了让Scala运行起来还是很麻烦&#xff0c;为了大家方便&#xff0c;还是记录下来&#xff1a; 1、首先我下载的是IDEA的社区版本&#xff0c;版本号为15. 2、下载安装scala插件&#xff1a; 2.1 进入设置菜单。 2.2 点击安装JetBrains plugin 2.3 输入scala查询插件&#xff…

使用try-with-resources替代try finally释放资源

2019独角兽企业重金招聘Python工程师标准>>> 1、旧社会 Java里&#xff0c;对于文件操作IO流、数据库连接等开销非常昂贵的资源&#xff0c;用完之后必须及时通过close方法将其关闭&#xff0c;否则资源会一直处于打开状态&#xff0c;直至程序停止&#xff0c;增加…

平板电脑离寿终正寝还有多远?

近期有评论称&#xff0c;因为大尺寸智能手机越来越普及&#xff0c;小尺寸平板正遭受着越来越严重的冲击&#xff0c;在这样的背景下&#xff0c;平板厂商也纷纷转攻超大尺寸平板市场&#xff0c;以此避开大尺寸智能手机的竞争&#xff0c;只是。这样的策略转变是否能扭转平板…

Swift 与 JSON 数据

转载自&#xff1a; http://www.cnblogs.com/theswiftworld/p/4660177.html 我们大家平时在开发 App 的时候&#xff0c;相信接触最多的就是 JSON 数据了。只要你的 App 有读取网络数据的功能&#xff0c;你就免不了要与 JSON 打交道。比如你做一个新闻 App&#xff0c;你要读取…

TeamViewer - 最好用强大的免费跨平台远程桌面控制软件 (支持电脑和手机)

from&#xff1a;很早以前 LYcHEE 就提到过&#xff0c;家中的潮人爷爷奶奶每天摆弄着电脑&#xff0c;看看新闻发发邮件&#xff0c;安享晚年生活。只是意料之中的&#xff0c;电脑上莫名出现各种问题&#xff1f;不翼而飞的图标&#xff1f;照片又忘记怎么导出了&#xff1f;…

【设计模式】7、桥接模式

桥接模式就是对一个类的方法进行抽象化&#xff0c;吧不相关的因素提取出来&#xff0c;发展出第二个类 1 package com.shejimoshi.structural.Bridge;2 3 4 /**5 * 功能&#xff1a;桥接模式使用6 * 意图&#xff1a;将抽象部分与它的实现部分分离&#xff0c;使他们都…

TeamViewer免费版和付费版有什么不同

提到远程控制软件 TeamViewer无疑是目前业内知名度比较高的一款&#xff0c;所以说到远程控制软件可能大部分人首先想到的就是TeamViewer。在使用功能上&#xff0c;它支持远程桌面控制、文件传输、远程计算机锁定、视频会话、主控方和被控方身份互换&#xff0c;远程管理无人执…

【代码笔记】iOS-翻书效果的实现

代码&#xff1a; RootViewController.m #import "RootViewController.h"interface RootViewController ()endimplementation RootViewController- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {self [super initWithNibName:…

Halcon—Tuple中符号的含义

2014年08月08日 21:20:30阅读数&#xff1a;5429实例一&#xff08;3d_coordinates.hdev&#xff09;&#xff1a;for I : 1 to NumImages by 1read_image (Image, calib/calib-3d-coord-I$02d)——C:\Program Files\MVTec\HALCON-10.0\images\的calib文件夹中开头是calib-3d-c…