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
相关产品推荐
相关产品推荐

