C++实现统计各字母开头单词数的程序开发求助
解决你的C++单词首字母统计问题
Hey,你已经完成了最核心的单词提取部分啦!现在就差把首字母的统计逻辑补上,再把结果输出到新文件里。我来帮你一步步完善代码:
首先,你定义的alphabet[26]数组没有初始化,里面默认是随机垃圾值,这肯定没法正确统计。咱第一步先把数组初始化为全0:
int alphabet[26] = {0}; // 每个字母的计数初始都是0
然后,你之前是把首字母直接输出到控制台,现在改成对应索引的计数加1。比如字母'A'对应的索引是'A' - 'A' = 0,'B'是1,以此类推,所以每次拿到首字母后:
char first_letter = toupper(word[0]); alphabet[first_letter - 'A']++; // 对应字母的计数+1
读取完所有单词后,我们需要遍历这个数组,把A-Z每个字母和对应的计数输出,同时写入到新文件里。比如创建一个result.txt来保存结果。另外别忘了处理文件读取失败的异常情况,让程序更健壮。
下面是完整的修改后的代码:
#include <iostream> #include <fstream> #include <string> #include <cctype> using namespace std; int main() { ifstream fin("test.txt"); // 检查输入文件是否成功打开 if (!fin.is_open()) { cerr << "无法打开输入文件test.txt!" << endl; return 1; } string word; char ch; int alphabet[26] = {0}; // 初始化所有字母计数为0 while (fin.get(ch)) { if (isspace(ch)) { continue; // 跳过空格字符 } else if (ch == ':') { // 遇到冒号,代表一个单词结束 if (!word.empty()) { // 避免处理空单词(比如连续冒号的情况) char first_letter = toupper(word[0]); alphabet[first_letter - 'A']++; word.clear(); } } else { word += ch; } } // 处理文件最后一个没有冒号结尾的单词 if (!word.empty()) { char first_letter = toupper(word[0]); alphabet[first_letter - 'A']++; } // 创建并打开输出文件 ofstream fout("result.txt"); if (!fout.is_open()) { cerr << "无法创建输出文件result.txt!" << endl; return 1; } // 遍历A-Z,同时输出到控制台和文件 for (int i = 0; i < 26; i++) { char letter = 'A' + i; cout << letter << " " << alphabet[i] << endl; fout << letter << " " << alphabet[i] << endl; } // 关闭文件 fin.close(); fout.close(); cout << "统计完成,结果已保存到result.txt" << endl; return 0; }
关键细节说明:
- 新增文件打开失败的判断,避免程序无意义崩溃
- 初始化计数数组为全0,确保统计起点正确
- 处理了空单词的边界情况(比如输入中有连续冒号)
- 读取完成后遍历数组,同时输出到控制台和目标文件
- 手动关闭文件,养成规范的文件操作习惯
用你给出的输入示例测试的话,输出文件result.txt里的内容会和你预期的完全一致:
A 0 B 1 C 0 D 0 E 1 F 1 G 0 H 1 I 0 J 0 K 0 L 1 M 2 N 0 O 0 P 1 Q 1 R 0 S 3 T 0 U 0 V 1 W 1 X 0 Y 1 Z 0
内容的提问来源于stack exchange,提问作者Uchida
相关产品推荐
相关产品推荐

