cout上的C ++ EOF<

时间:2012-02-22 21:14:15

标签: c++ char eof

这是我的代码:

#include <cstdlib>
#include <iostream>
#include <cstring>

using namespace std;

int main(int argc, char *argv[])
{
    int duze[26];
    int male[26];
    int n;
    //cout<<int('a')<<endl<<int('A');
    cin>>n;

    char temp;
    for (int i=0; i<27; i++)
        male[i]=0;
    for (int i=0; i<27; i++)
        duze[i]=0;

    while (n>=0)
    {
        cin.get(temp);
        if (temp=='\n') { n--; continue;}
        if (temp==' ') continue;
        if (temp>='a' && temp<='z')
            male[temp-'a']++;
        else if (temp>='A' && temp<='Z')
            duze[temp-'A']++;
    }

    for (int i=0; i<27; i++)
        if (male[i]>0) cout<<char(i+'a')<<" "<<male[i]<<endl;
    for (int i=0; i<27; i++)
        if (duze[i]>0) cout<<char(i+'A')<<" "<<duze[i]<<endl;
    //system("pause");
    return 0;
}

该程序计算给定n行文本中的字母。跳过不存在的字母。 当我在控制台中运行它看起来没问题,但我知道在字符之前有EOF字符... 我怎么能避免它?

3 个答案:

答案 0 :(得分:3)

你有一个buffer overflow(实际上有几个)。您声明了两个大小为26的数组(duzemale),然后继续将数据写入27个索引(0到26)。

由于这超出了缓冲区的范围,因此您正在踩踏其他内存,这会导致不稳定,不可预测的行为。 C ++标准称之为未定义的行为:一旦你这样做,绝对会发生任何事情:你的程序可能会崩溃,它可能会有这样的细微错误,它可能看起来工作正常,甚至可能擦除你的硬盘(虽然这不太可能)。

要解决此问题,请将所有27个更改为26个;你也可以将数组大小增加到27,但是打印出char(26+'a')会给你{,这可能不是你的意图。

答案 1 :(得分:2)

您应该检查以下内容:

if ( cin.get(temp) )
{
  // read was ok
}
else
{
  // eof or other issue on read
}

答案 2 :(得分:2)

数组索引从0运行到N-1,其中N是元素数:所有for循环访问1太多导致未定义的行为。将for循环上的终止条件更改为i < 26

另一个小注意事项,为了简化duzemale的初始化,您将它们声明为:

int duze[26] = { 0 };
int male[26] = { 0 };

这会将所有元素设置为0,这意味着您可以删除当前执行此操作的两个for循环。