题目
实现一个函数计算字符串中的单词数量
信息
- 类型:问答
- 难度:⭐⭐
考点
字符串处理,指针操作,边界条件处理
快速回答
实现要点:
- 使用指针遍历字符串,跳过连续空格
- 当遇到非空格字符且前一个字符是空格或字符串开头时,计数加1
- 正确处理空字符串和全空格字符串
- 时间复杂度 O(n),空间复杂度 O(1)
问题描述
实现函数 int count_words(const char *str),计算输入字符串中的单词数量(单词以空格分隔,不考虑其他分隔符)。
原理说明
核心思路:通过指针遍历字符串,在从空格到非空格字符的转换点计数。关键点:
- 单词定义为由空格分隔的非空字符序列
- 连续多个空格视为一个分隔符
- 字符串开头和结尾的空格不产生额外计数
代码实现
#include <stdbool.h>
int count_words(const char *str) {
if (str == NULL || *str == '\0') return 0;
int count = 0;
bool in_word = false;
while (*str) {
if (*str != ' ') {
// 遇到非空格字符且不在单词中时计数
if (!in_word) {
count++;
in_word = true;
}
} else {
in_word = false; // 遇到空格,标记离开单词
}
str++;
}
return count;
}最佳实践
- 边界处理:检查 NULL 指针和空字符串
- 状态标记:使用
in_word标志跟踪当前解析状态 - 指针操作:直接移动指针而非使用索引,效率更高
- 可读性:避免复杂嵌套条件
常见错误
- 未处理连续空格:错误地将连续空格视为多个单词分隔
- 边界遗漏:未处理字符串开头/结尾的单词
- 空指针崩溃:未检查
str == NULL - 全空格字符串:应返回 0 而非错误计数
测试用例
// 常规测试
assert(count_words("Hello world") == 2);
// 边界测试
assert(count_words(" leading spaces") == 2);
assert(count_words("trailing spaces ") == 2);
// 极端情况
assert(count_words("") == 0); // 空字符串
assert(count_words(" ") == 0); // 全空格
assert(count_words(NULL) == 0); // 空指针扩展知识
- Unicode 支持:当前实现仅处理 ASCII 空格,实际项目中需考虑 Unicode 空格字符
- 分隔符扩展:可通过
isspace()函数支持所有空白字符(制表符、换行符等) - 性能优化:在嵌入式系统中可使用状态机减少分支
- 相关函数:对比标准库
strtok()的实现差异(线程安全与副作用)