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

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;
    }
}

关键修改说明

  1. 参数传递优化:统计函数接收主函数的输入文本和统计数组,输出函数接收统计数组,彻底解决变量作用域问题。
  2. 简化遍历逻辑:用范围for循环遍历string,无需手动处理char数组和终止符,代码更简洁安全。
  3. 大小写兼容:通过tolower统一转换字符,确保大小写字母都能被统计。
  4. 格式匹配调整:输出时转为大写字母,完全匹配需求中的A: x格式。
  5. 修正调用语法:主函数中直接调用函数并传递参数,移除错误的void关键字。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 01:37:01