数组初始化和查找字母频率

时间:2015-05-09 04:45:38

标签: c++ arrays loops for-loop ifstream

我正在尝试计算字符串数组中字母的频率,并将频率设置为整个字母表大小的数组。我希望我设计的方式让大/小的情况无关紧要。在此之后,我想将最高频率的字母设置为该字母表中的“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;
}

1 个答案:

答案 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;消息。