使用c语言编写wc命令——统计字符数、单词数、行数

我们知道linux操作系统上有一个非常常用的命令,用来统计字符数、单词数以及行数的wc命令。今天,我们来尝试使用c语言来编写一个类似功能的程序(注:阅读本文需要一定的c语言基础)。

编写该程序时,需要掌握两个函数的用法,getchar()以及putchar()。

getchar用来从标准输入中读取一个字符,而putchar则是向标准输出打印一个字符。统计标准输入字符数比较简单,只要getchar函数还能读入字符,统计字符数的变量就自增加1。统计行数也简单,只要读入的字符为换行符\n则将统计函数的变量自增加1。

这里的主要难点在于如何统计单词的数量,这里我的思路是,设定一个状态变量IN_WORD,当读入的字符是空白字符时(空格、水平制表符、换行符都为空白字符),IN_WORD值为0,统计的单词数目不变,当等到读入一个非空白字符时,统计单词的数目加1,IN_WORD值为1,当该状态值为1时,即使读入了非空白字符,单词统计的数目也不变动。

下面,贴出代码

立即学习“C语言免费学习笔记(深入)”;

#include #include #define IN_WORD 1#define OUT_WORD 0void main (void){    int nc,nw,nl;    char c,word_flag;        nc = nw = nl = 0;    word_flag = OUT_WORD;        while ((c = getchar()) != EOF) {        nc ++;                if (c == '\n') {            nl ++;        }                if (!isspace(c) && word_flag == OUT_WORD) {            nw ++;            word_flag = IN_WORD;        } else if (isspace(c) && word_flag == IN_WORD) {            word_flag = OUT_WORD;        }     }        printf("%d\t%d\t%d\n", nc, nw, nl);}

上述代码还是非常的简单的,nc,nw,nl三个变量分别来统计字符数、单词数以及行数。而word_flag是用来记录状态的,状态分为两种,IN_WORD以及OUT_WORD。

接下来,我们来测试下上述代码。下面是一段文本:

Product-minded engineers are developers with lots of interest in the product itself. They want to understand why decisions are made, how people use the product, and love to be involved in making product decisions.They're someone who would likely make a good product manager if they ever decide to give up the joy of engineering. I've worked with many great product-minded engineers and consider myself to be this kind of developer. At companies building world-class products, product-minded engineers take teams to a new level of impact.

上述文本共有86个单词,共五行。

# cat 1.txt | ./a.out 542 86 5

可以看到,该程序可以正常统计字符数、单词数以及行数。

以上就是使用c语言编写wc命令——统计字符数、单词数、行数的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/162624.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年10月31日 21:33:10
下一篇 2025年10月31日 21:34:09

相关推荐

  • 如何在Laravel中配置Redis缓存

    在laravel中配置redis缓存的核心步骤包括安装并运行redis服务、安装php扩展或composer包、配置.env文件和config/database.php、清除缓存。1. 安装redis服务器:使用系统包管理工具安装并启动redis服务;2. 安装php扩展或predis包:选择php…

    2025年12月5日
    000
  • linux下gdb调试方法与技巧整理「建议收藏」

    大家好,很高兴再次与大家见面,我是你们的老朋友全栈君。 目录一、gdb简介二、gdb使用流程1、启动gdb2、查看源码3、运行程序4、设置断点5、单步执行6、查看变量7、退出gdb三、gdb基本使用命令1、运行命令2、设置断点3、查看源码4、打印表达式5、查看运行信息6、分割窗口7、cgdb强大工具…

    2025年12月5日
    000
  • ucrtbase.dll运行库错误 原因及解决指南

    一、ucrtbase.dll是什么? ucrtbase.dll 是微软通用C运行时库(Universal C Runtime,简称UCRT)中的关键动态链接库文件,负责为基于C语言开发的程序提供基础运行支持。自Windows 10起,该运行库被集成进系统核心组件中,同时也包含在Visual C++ …

    2025年12月5日 电脑教程
    000
  • Socket 编程

    最近我在录制一套关于web页面获取mac地址的视频,这是一个真实项目中的案例,解决方案也经历了几次迭代。最终,我们通过使用socket api模拟http协议来解决这个问题。 以下是我录制的视频链接,《WEB端获取MAC地址真实项目案例》: https://www.php.cn/link/4e189…

    2025年12月3日
    000
  • Swoole如何实现高效序列化?序列化方法有哪些?

    Swoole中高效序列化需根据场景选择方法:PHP内置serialize性能差,适合保留完整对象状态;json_encode性能较好,适用于Web API;MessagePack和Protobuf为高性能首选,适用于内部RPC与缓存,其中Protobuf结构严谨、体积小,MessagePack轻量快…

    2025年12月3日
    100
  • CCT上机模拟考试系统使用指南

    %ignore_a_1%上机模拟测试如何开启与运用?快跟随小编一起揭秘吧! 1、 先启动模拟考试系统,用鼠标点击屏幕进入下一界面。 2、 按一下任意键继续操作。 3、 根据提示输入模拟考生编号,比如11324000101,输入完毕后就可以开始了。 4、 确认是否继续。 农业园林门户网源码 农业园林门…

    2025年12月3日 软件教程
    000
  • Workerman与Swoole区别?Workerman对比传统PHP架构?

    Workerman和Swoole均为提升PHP高并发性能的异步框架,Workerman基于纯PHP开发,轻量易用,适合快速上手和中小型项目;Swoole以C语言扩展实现,性能更强,功能丰富,适合高性能、高并发场景但学习成本较高。两者均支持常驻内存,避免传统PHP重复加载开销,适用于WebSocket…

    2025年12月3日
    100
  • Turbo C 2.01完美教程:从入门到精通

    学习%ign%ignore_a_1%re_a_1%时,常常需要使用turbo c 2.01来进行程序的编译与运行,但部分用户可能觉得这款软件操作不便或不清楚具体步骤。接下来,小宋将为大家详细介绍该软件的正确使用方式。 1、 双击桌面上已安装的Turbo C 2.01图标,即可启动程序。 2、 小技巧…

    2025年12月3日 软件教程
    000
  • VBS中使用Left函数的注意事项

    vbscript(简称vbs)属于visual basic语言家族,是一种灵活的脚本语言,其功能与javascript相似。在该语言中,left函数的作用是从字符串的左侧开始提取特定数量的字符。使用vbscript中的left方法时,有一些注意事项需要遵守:首先,确保传入的数据是字符串类型,否则可能…

    2025年12月3日 软件教程
    000
  • 零基础学习C语言:从入门到精通的实用指南

    c语言融合了高级语言与汇编语言的优势,长期稳居编程语言排行榜前列。这门优秀的语言虽学习者众多,但真正掌握的人却不多。对于零基础的新手来说,如何入门并深入掌握c语言呢? 1、 学习编程首先要准备一台电脑,配置不必追求顶级,主流水平即可满足学习需求。 2、 在选择操作系统时,大多数人习惯使用Window…

    2025年12月3日 软件教程
    000
  • JavaScript异常处理学习指南

    js与#%#$#%@%@%$#%$#%#%#$%@_9e6df79f947a44c++8a2ba49c4428632a1存在差异,但更贴近c++,支持异常处理机制。 1、 通常情况下,在编写易语言辅助程序时,若无法获取游戏窗口句柄,易语言会直接报错。此时可以通过加入逻辑判断来处理,例如当窗口句柄未找…

    2025年12月3日 软件教程
    000
  • 提升编程能力:女生专属攻略

    在互联网浪潮中,女生不应落后,要提升编程技能,有哪些途径? 1、 首先需要扎实掌握一门编程语言,建议从C语言入手,它简洁易懂,且拥有丰富的学习资料。 2、 在掌握编程语言之后,应进一步学习算法知识。推荐深入研读数据结构与算法相关书籍,这将极大增强技术能力。 3、 当能够熟练编写小型程序后,可以尝试开…

    2025年12月3日 软件教程
    000
  • Oracle数据库数据源怎么建_Oracle数据源配置完整流程详解

    配置Oracle数据源需选择合适连接技术并提供正确连接信息。首先引入Oracle JDBC驱动,如通过Maven添加ojdbc8依赖;随后根据应用类型配置连接参数:Spring Boot中在application.properties或yml中设置URL、用户名、密码和驱动类名;传统Web应用通过c…

    2025年12月3日 数据库
    000
  • Go语言中无函数体的函数声明:深入理解其用途与实现机制

    Go语言允许函数声明省略函数体,这种语法主要用于声明在Go语言外部实现的函数,例如汇编例程或通过CGO调用的C函数。它为编译器提供了函数签名,指示实际实现将在其他地方找到,从而实现性能优化或平台特定功能,是Go语言与底层代码交互的重要机制。 Go语言规范对无函数体声明的定义 根据go语言规范,函数声…

    2025年12月3日 后端开发
    000
  • Go语言中零终止字节数组到字符串的优雅转换

    本教程探讨在go语言中如何将c风格的零终止字节数组转换为go字符串。由于go字符串不以零终止符为界,直接转换可能导致末尾出现乱码。文章详细介绍了两种主要方法:一是利用读取操作返回的有效字节数进行切片转换,二是当有效长度未知时,使用bytes包查找零终止符并进行截取,以确保正确且高效地处理数据。 在G…

    2025年12月3日 后端开发
    000
  • Golangfor循环的几种写法

    Go语言中for循环是唯一的循环结构,支持多种写法。1. 传统三段式:如for i := 0; i < 5; i++,包含初始化、条件判断和迭代语句,适用于已知循环次数的场景。 Go语言中的for循环是唯一的一种循环结构,但它非常灵活,支持多种写法来适应不同的使用场景。下面介绍几种常见的for…

    2025年12月3日 后端开发
    000
  • Go语言中字符串到时间对象的转换:time.Parse() 深度解析

    本文旨在详细讲解Go语言中如何将日期字符串转换为time.Time类型。我们将重点介绍time.Parse()函数的使用方法,特别是其核心参数——格式化字符串的构造规则,并通过具体代码示例展示如何安全高效地完成字符串到时间对象的转换。 在go语言的开发实践中,我们经常会遇到需要将各种格式的日期字符串…

    2025年12月3日 后端开发
    000
  • 精通Go Cgo:C结构体数组与函数指针传递的类型匹配深度解析

    本文深入探讨了在Go语言中使用Cgo与C结构体数组交互时常见的类型匹配问题,特别是涉及typedef和struct标签的差异。通过分析_Ctype_TypeName和C.struct_TypeName在Cgo中的行为,以及C语言的案例敏感性如何影响Go中的类型推断,文章揭示了导致*[0]byte类型…

    2025年12月3日 后端开发
    100
  • Go Cgo 结构体数组与指针传递:避免类型不匹配的陷阱

    本文深入探讨了在Go语言中使用Cgo与C函数交互时,处理C结构体数组及指针传递的常见陷阱。重点分析了因C语言的命名大小写敏感性以及Go语言严格的类型系统导致的类型不匹配问题,并提供了清晰的解决方案和最佳实践,帮助开发者正确地在Go中操作C结构体类型。 1. Cgo与C结构体交互概述 在使用go语言通…

    2025年12月3日 后端开发
    000
  • Go语言:二进制文件读取指南

    本文旨在提供一份全面的Go语言二进制文件读取教程。我们将探讨如何使用os包进行文件打开与关闭,利用io.Reader接口进行基础字节读取,通过bufio.Reader实现缓冲读取以提升效率,借助encoding/binary包解析结构化二进制数据,以及利用io/ioutil包(或其现代替代方案)便捷…

    2025年12月3日 后端开发
    000

发表回复

登录后才能评论
关注微信