侧边栏壁纸
博主头像
colo

欲买桂花同载酒

  • 累计撰写 1824 篇文章
  • 累计收到 0 条评论

实现一个函数计算字符串中的单词数量

2025-12-11 / 0 评论 / 4 阅读

题目

实现一个函数计算字符串中的单词数量

信息

  • 类型:问答
  • 难度:⭐⭐

考点

字符串处理,指针操作,边界条件处理

快速回答

实现要点:

  • 使用指针遍历字符串,跳过连续空格
  • 当遇到非空格字符且前一个字符是空格或字符串开头时,计数加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() 的实现差异(线程安全与副作用)