这是我的代码:
#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字符... 我怎么能避免它?
答案 0 :(得分:3)
你有一个buffer overflow(实际上有几个)。您声明了两个大小为26的数组(duze
和male
),然后继续将数据写入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
。
另一个小注意事项,为了简化duze
和male
的初始化,您将它们声明为:
int duze[26] = { 0 };
int male[26] = { 0 };
这会将所有元素设置为0
,这意味着您可以删除当前执行此操作的两个for
循环。