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

C++仅用<iostream>和<string>实现字符串转小写、分词及计数求助

解决C++转小写输出无空格及单词统计问题

嘿,我来帮你搞定这两个问题!咱们一步一步来:

一、解决转小写后单词无空格的问题

你遇到的输出没空格的问题,大概率是读取输入的方式不对。如果用cin >> s读取输入,它会自动跳过所有空白字符(空格、换行、制表符等),每次只读取一个单词。这样转小写后直接输出,自然就没有空格了。

解决办法:用getline(cin, input_str)读取整行输入,这样就能保留输入中的所有空格、换行等格式,转小写后输出就会有空格啦。

你的转小写逻辑是没问题的,只处理A-Z的字符,不会修改空格,所以只要读取到完整的带空格的字符串,转小写后输出就正常了。

二、提取单词并统计总单词数

要统计单词数并提取每个单词,我们可以通过遍历字符串,判断单词的边界来实现。核心思路是用一个标记变量记录当前是否处于单词中,遇到单词开头时计数,同时收集单词字符。

完整代码示例

#include <iostream>
#include <string>
#include <vector>

using namespace std;

int main() {
    string input;
    // 读取整行输入,保留所有空格
    getline(cin, input);

    // 1. 转小写处理,保留空格
    for (int i = 0; i < input.size(); ++i) {
        if ('A' <= input[i] && input[i] <= 'Z') {
            input[i] = input[i] + 'a' - 'A';
        }
        // 非大写字母(包括空格)保持原样
    }

    // 输出转小写后的文本(现在单词间会有空格了)
    cout << "转小写后的文本:" << input << endl;

    // 2. 提取单词并统计数量
    vector<string> words_list;
    int total_words = 0;
    bool is_in_word = false;
    string current_word;

    for (char c : input) {
        if (c != ' ') { // 假设以空格作为单词分隔符,若有标点可扩展判断条件
            if (!is_in_word) {
                // 新单词开始,计数加1
                total_words++;
                is_in_word = true;
            }
            current_word += c;
        } else {
            if (is_in_word) {
                // 单词结束,存入列表
                words_list.push_back(current_word);
                current_word.clear();
                is_in_word = false;
            }
            // 连续空格时,is_in_word已经是false,无需处理
        }
    }

    // 处理最后一个单词(避免输入以非空格结尾的情况)
    if (is_in_word) {
        words_list.push_back(current_word);
    }

    // 输出统计结果
    cout << "\n总单词数:" << total_words << endl;
    cout << "提取的单词列表:" << endl;
    for (const string& word : words_list) {
        cout << "- " << word << endl;
    }

    return 0;
}

代码说明

  • 转小写部分:仅对大写字母进行转换,空格和其他字符原样保留,确保输出时单词间的空格不会丢失。
  • 单词统计与提取:
    • is_in_word标记当前是否处于单词中,初始为false。
    • 遇到非空格字符且不在单词中时,判定为新单词开头,计数器加1,并切换到单词内状态。
    • 遇到空格且在单词中时,判定为单词结束,将当前单词存入列表并重置临时变量。
    • 循环结束后检查是否有未存入的最后一个单词,避免遗漏输入末尾的单词。

如果不需要存储单词,只统计数量的话,可以去掉vector<string> words_list及相关存储逻辑,只保留total_words的计数即可,代码会更简洁。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 03:34:26