我正在尝试计算字符串数组中字母的频率,并将频率设置为整个字母表大小的数组。我希望我设计的方式让大/小的情况无关紧要。在此之后,我想将最高频率的字母设置为该字母表中的“e”(因为e在许多语言中出现的频率最高)并找到最频繁的字母和e之间的差异。 这似乎在我的心理演练中有意义,但我的编译器出于某种原因给了我断点,并且不允许我检查它,所以我不确定是什么问题。所以请原谅我没有发布SSCCE。在此先感谢您的帮助!
#include <iostream>
#include <fstream>
using namespace std;
int main()
{
int alpharay[26];
for (int i = 0; i < 26; i++)
{
alpharay[i] = 0;
}
ifstream input;
cout << "File name (.txt): ";
string fileName;
cin >> fileName;
input.open(fileName.c_str());
while (!input.eof())
{
string newLine;
getline (input, newLine);
for (int i = 0; i < newLine.length(); i++)
{
if (isalpha(newLine[i]))
{
int index;
if (isupper(newLine[i]))
{
index = newLine[i] - 'A';
alpharay[index]++;
}
else if (islower (newLine[i]))
{
index = newLine[i] - 'a';
alpharay[index]++;
}
}
}
}
//To find the largest value in array
int largest = 0;
char popular;
for (int i = 0; i < 26; i++)
{
if (alpharay[i]>=largest)
{
largest = alpharay[i];
popular = 'a' + i;
}
}
//To find the size of the shift
int shift = popular - 'e';
cout << "Shift size: " << shift << endl;
return 0;
}
答案 0 :(得分:1)
问题1:
input.open(fileName.c_str());
while (!input.eof())
需要检查文件是否完全打开。如果文件没有打开,你永远不会得到EOF。
input.open(fileName.c_str());
if (input.is_open()
{
while (!input.eof())
// rest of your code
}
else
{
cout << "Couldn't open file " << fileName << endl;
}
但这只是绷带问题。除了你需要注意的EOF之外,文件还有很多其他内容可以发生。
问题2:
while (!input.eof())
{
string newLine;
getline (input, newLine);
for (int i = 0; i < newLine.length(); i++)
那么如果getline读取EOF怎么办?程序将其处理为有效行,然后测试EOF。同样,一个简单的解决方法:
string newLine;
while (getline (input, newLine))
{
for (int i = 0; i < newLine.length(); i++)
// rest of loop code
}
只要阅读了行,就继续。如果没有行,无论原因如何,循环退出。
问题3:
如果没有字母字符,此循环将返回&#39; z&#39;:
for (int i = 0; i < 26; i++)
{
if (alpharay[i]>=largest)
{
largest = alpharay[i];
popular = 'a' + i;
}
}
简单的解决方案是按原样运行循环,然后测试最大== 0并打印一个合适的&#34;找不到字母&#34;消息。