我在执行代码时不断收到 "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.
这段代码的目的是获取一个已经传入程序的文件,并生成文件中每个字母的字母频率。在上面的代码中,我删除了标点符号并转换为小写字母。
#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.