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

