C++字符串转数组及字母计数问题求助
字母直方图程序修正方案
核心问题分析
- 变量作用域错误:统计函数和输出函数内的数组都是局部变量,主函数的输入文本无法传递进去,统计结果也无法在函数间共享。
- 无效的数组初始化:
char str[100]= {getline};是完全错误的写法,无需将string转为char数组,直接遍历string即可。 - 函数声明与实现不匹配:声明的
skriv_histogram_abs要求两个参数,但实现和调用都未处理参数逻辑。 - 函数调用语法错误:主函数调用函数时不需要加
void关键字。 - 大小写未统一处理:原代码仅统计小写字母,忽略了大写字母的情况。
修正后的完整代码
#include <iostream> #include <string> #include <cctype> using namespace std; const int ANTAL_BOKSTAVER = 26; // 调整函数参数,传递输入文本和统计数组 void berakna_histogram_abs(const string& text, int alfabet[]); // 传递统计数组给输出函数 void skriv_histogram_abs(const int alfabet[]); int main() { string text; int alfabet[ANTAL_BOKSTAVER] = {0}; // 初始化统计数组为0 cout << "Skriv in texten: "; getline(cin, text); // 正确调用函数并传递参数 berakna_histogram_abs(text, alfabet); skriv_histogram_abs(alfabet); return 0; } void berakna_histogram_abs(const string& text, int alfabet[]) { for (char c : text) // 直接遍历string的每个字符 { // 统一转为小写,兼容大小写字母统计 char lower_c = tolower(c); if (lower_c >= 'a' && lower_c <= 'z') { int index = lower_c - 'a'; alfabet[index]++; } } } void skriv_histogram_abs(const int alfabet[]) { cout << "Frekvensen av alla bokstäver är: " << endl; for (int i = 0; i < ANTAL_BOKSTAVER; i++) { // 输出大写字母,匹配需求格式 cout << char(i + 'A') << ": " << alfabet[i] << endl; } }
关键修改说明
- 参数传递优化:统计函数接收主函数的输入文本和统计数组,输出函数接收统计数组,彻底解决变量作用域问题。
- 简化遍历逻辑:用范围for循环遍历string,无需手动处理char数组和终止符,代码更简洁安全。
- 大小写兼容:通过
tolower统一转换字符,确保大小写字母都能被统计。 - 格式匹配调整:输出时转为大写字母,完全匹配需求中的
A: x格式。 - 修正调用语法:主函数中直接调用函数并传递参数,移除错误的
void关键字。
内容的提问来源于stack exchange,提问作者coffeboi
相关产品推荐
相关产品推荐

