C++命令行字符串处理程序求助:重复词与词频统计功能
解决思路与完整代码实现
别担心,新手阶段找不到清晰资料太正常了!我来一步步帮你把需求落地——咱们要做的是一个能通过管道接收输入、根据命令行参数输出不同结果的C++程序,结合你已经搞定的词频统计功能,咱们来补全剩下的逻辑。
核心步骤拆解
首先明确咱们的程序要支持两种用法:
- 统计词频:
echo "你的输入字符串" | ./your_program -c - 输出重复单词:
echo "你的输入字符串" | ./your_program -d
1. 处理命令行参数
C++程序通过argc(参数数量)和argv(参数数组)获取命令行参数,咱们首先要判断用户传的是-c还是-d,还要处理参数错误的情况。
2. 从标准输入读取内容
因为是通过echo管道传输入,所以咱们要从stdin(标准输入)读取所有文本,再分割成单个单词。这里用std::cin配合>>运算符就很方便,它会自动跳过空格、换行等空白符,直接读取单词。
3. 结合已有词频逻辑实现不同输出
- 若参数是
-c:直接输出你已经实现的词频统计结果 - 若参数是
-d:遍历词频统计的容器,只输出出现次数大于1的单词
完整示例代码
#include <iostream> #include <unordered_map> #include <string> using namespace std; int main(int argc, char* argv[]) { // 第一步:检查命令行参数是否合法 if (argc != 2) { cout << "用法错误!请使用:echo \"输入内容\" | ./程序名 -c 或 -d" << endl; return 1; } string option = argv[1]; if (option != "-c" && option != "-d") { cout << "无效参数!仅支持 -c(统计词频)和 -d(输出重复单词)" << endl; return 1; } // 第二步:读取输入并统计词频(整合你已实现的逻辑) unordered_map<string, int> wordCount; string word; // 从标准输入读取所有单词 while (cin >> word) { // 如果需要忽略大小写,可以取消下面注释转成小写 // for (char& c : word) c = tolower(c); wordCount[word]++; } // 第三步:根据参数执行不同逻辑 if (option == "-c") { cout << "词频统计结果:" << endl; for (const auto& pair : wordCount) { cout << pair.first << ": " << pair.second << endl; } } else if (option == "-d") { cout << "重复出现的单词:" << endl; for (const auto& pair : wordCount) { if (pair.second > 1) { cout << pair.first << endl; } } } return 0; }
测试方法
编译代码(假设保存为
word_tool.cpp):g++ word_tool.cpp -o word_tool测试词频统计:
echo "hello world hello apple world banana" | ./word_tool -c
输出会是:
词频统计结果: hello: 2 world: 2 apple: 1 banana: 1
- 测试重复单词输出:
echo "hello world hello apple world banana" | ./word_tool -d
输出会是:
重复出现的单词: hello world
小提示
- 如果需要忽略单词的大小写(比如把"Hello"和"hello"当成同一个单词),可以取消代码里转小写的注释。
- 如果要处理带标点的单词(比如"hello,"),可以额外写一个函数去除首尾的非字母字符,让统计更准确。
内容的提问来源于stack exchange,提问作者user9583887
相关产品推荐
相关产品推荐

