1. 题目分析与理解
C Primer Plus第六版第十二章编程练习第1题主要考察文件输入输出操作和命令行参数处理。题目要求编写一个程序,该程序能够读取用户指定的文本文件,并统计文件中的单词数量。具体要求如下:
- 程序应接受一个命令行参数,即要统计的文件名
- 程序需要正确识别文件中的单词边界(以空白字符分隔)
- 输出文件中包含的单词总数
这个练习综合运用了第十二章讲解的多个核心知识点:
- 文件I/O操作(fopen、fclose等)
- 命令行参数处理(argc、argv)
- 字符处理与单词识别逻辑
- 错误处理机制
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 解决方案设计思路
2.1 程序基本框架
程序的基本执行流程应该包含以下几个步骤:
- 检查命令行参数是否正确
- 尝试打开指定的文件
- 逐字符读取文件内容
- 识别单词边界并计数
- 输出统计结果
- 关闭文件并处理可能的错误
2.2 单词识别算法
单词识别的核心逻辑需要考虑以下边界情况:
- 连续多个空白字符(空格、制表符、换行等)
- 文件开头和结尾的空白字符
- 标点符号与单词的连接情况
- 文件为空的情况
一个稳健的单词计数算法可以采用状态机的方式实现:
- 初始状态为"不在单词中"
- 当遇到非空白字符时,如果当前状态为"不在单词中",则单词计数加1,并切换到"在单词中"状态
- 当遇到空白字符时,切换到"不在单词中"状态
3. 完整代码实现
c复制#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
int main(int argc, char *argv[])
{
FILE *fp;
int ch;
int word_count = 0;
int in_word = 0; // 标记是否在单词中
// 检查命令行参数
if (argc != 2) {
fprintf(stderr, "用法: %s 文件名\n", argv[0]);
exit(EXIT_FAILURE);
}
// 尝试打开文件
if ((fp = fopen(argv[1], "r")) == NUL
