我在执行代码时不断收到 "Bus Error"?

I continually get a "Bus Error" while this is code is being executed?

这段代码的目的是获取一个已经传入程序的文件,并生成文件中每个字母的字母频率。在上面的代码中,我删除了标点符号并转换为小写字母。

#include<iostream>
#include<string>
#include<fstream>

using namespace std;

int main()
{
    string fileContent = "qr rqh zrxog kdyh eholhyhg lq wkh odvw bhduv ri wkh qlqhwhhqwk fhqwxub wkdw wklv";

    int count[26] =  { 0 }; // an array the size of the alphabet.

    for(int f = 0; f < fileContent.length(); f++) // run til the file end.
    {
            if(fileContent[f] == 32) // to take care of the spaces.
            {
                    f++; // also tried "continue;" and yeild different and also incorrect results.
            }

            if(fileContent[f] >= 48 && fileContent[f] <= 57) //take care of numbers.
            {
                    f++; // tried "continue;"
            }

            count[fileContent[f]]++;

    }

    for(int p = 0; p < 26; p++)
    {
            cout << char(p + 97) << ": " << count[p]  << endl;
    }
return 0;
}

当我 运行 这段代码时,我得到了一些准确的频率,以及一些非常不正确的频率(似乎所有其他结果都是错误的,但在几个字母之后它会变成天文数字)。有什么办法可以做得更好吗?这段代码有什么问题?根据要求,我添加了更多代码(包括一个带有随机 100 的字符串),因为它显然不够清楚)

有关更多上下文,此程序适用于我正在研究的 Ceasar 移位解码器。我在基础 C++ 中,非常感谢您更有经验的开发人员的任何建议。谢谢!

在你的程序中,这条语句:

count[fileContent[f]]++;

应该是:

count[fileContent[f]-97]++; //Assuming that all alphabets are in lowercase

如果您不执行 -97,它会尝试增加 count 数组的索引 fileContent[f] 处的值,这可能会超出 count 的限制数组。

此外,请确保在两个 if 块中都 continue 并且您不需要在两个 if 块中明确地执行 f++ for 循环你已经在做 f++.

您正在以困难的方式做事:在您的代码中使用 C-style 数组、幻数,并且处处冒着缓冲区溢出的风险。

将您的代码与此进行比较:

#include <string>
#include <iostream>
#include <map>
using namespace std;

int main()
{
    string fileContent = "qr rqh zrxog kdyh eholhyhg lq wkh odvw bhduv ri wkh qlqhwhhqwk fhqwxub wkdw wklv";
    map<char, int> counts;

    for (char ch : fileContent)
        ++counts[ch];

    for (char ch = 'a'; ch <= 'z'; ++ch)
        cout << ch << ": " << counts[ch] << '\n';
}

或者打印所有地图内容(如果你不想为没有出现的字母打印 0)你可以使用:

for (auto& item : counts) 
    cout << item.first << ": " << item.second << '\n';

练习 reader 在代码中添加排除空格和数字。提示:查找 cctype header.