这是我的代码:
#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 字符...... 我该如何避免?
最佳答案
你有一个 buffer overflow (实际上有几个)。您声明了两个大小为 26 的数组(duze
和 male
),但随后您继续将数据写入 27 个索引(0 到 26)。
由于这超出了缓冲区的范围,您正在踩踏其他内存,这会导致不稳定、不可预测的行为。 C++ 标准称此为未定义行为:一旦您这样做,绝对可能发生任何事情:您的程序可能会崩溃,它可能会出现像这样的细微错误,它可能看起来工作正常,或者它甚至可能会删除您的硬盘驱动器(尽管这不太可能)。
要解决此问题,请将所有 27 位更改为 26 位;您也可以将数组大小增加到 27,但随后打印出 char(26+'a')
会得到 {
,这可能不是您的意图。
关于cout<<char(int) 转换上的 C++ EOF,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9403122/