You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言如何单次获取用户输入 结合数组完成文本统计并输出结果

C语言文本统计程序优化方案

原有代码问题

原代码先后3次调用get_string()要求用户重复输入文本,分别用三次独立循环统计字母、单词、句子数量,存在两个核心问题:

  • 用户需要重复输入三次相同文本,交互逻辑冗余
  • 三次遍历不同输入字符串做统计,执行效率低,且原单词计数靠统计空格实现,遇到连续空格、首尾带空格的输入会出现计数错误

优化后实现

优化逻辑遵循以下规则:

  • 仅调用1次get_string()获取用户输入,所有统计基于同一份输入文本完成
  • 用长度为3的整型数组存储三类统计结果,数组下标0对应字母数、1对应单词数、2对应句子数
  • 单次遍历字符串同步完成三类指标计数,无需多次循环
  • 修正单词计数逻辑,通过单词边界判断规避空格导致的计数错误,同时保持原有输出格式不变

优化后完整代码:

#include <cs50.h>
#include <stdio.h>
#include <string.h>
#include <ctype.h>

int main(void) {
    // 单次获取用户输入文本
    string text = get_string("text: ");
    int text_len = strlen(text);
    // 存储统计结果的数组:[字母数, 单词数, 句子数]
    int counts[3] = {0, 0, 0};
    int is_in_word = 0; // 标记当前是否处于单词内部,用于处理连续空格场景

    for (int i = 0; i < text_len; i++) {
        char c = text[i];
        // 字母计数
        if (isalpha(c)) {
            counts[0]++;
            // 识别到新单词边界,单词数+1
            if (!is_in_word) {
                counts[1]++;
                is_in_word = 1;
            }
        } else {
            is_in_word = 0;
            // 句子结束标点识别,句子数+1
            if (c == '.' || c == '!' || c == '?') {
                counts[2]++;
            }
        }
    }

    // 保持和原有代码一致的输出格式
    printf("%i %i %i\n", counts[0], counts[1], counts[2]);
    return 0;
}

效果说明

  • 交互层面:用户仅需输入1次文本即可得到所有统计结果,无需重复输入
  • 性能层面:仅需1次字符串遍历即可完成全部统计,时间复杂度从原实现的O(3n)降低到O(n)
  • 准确性层面:修正了原单词计数的逻辑漏洞,对开头/结尾带空格、包含连续多个空格的输入也能返回准确结果

内容的提问来源于stack exchange,提问作者Abdulrahman

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 11:57:21