cout<<char(int) 转换上的 C++ EOF

标签 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 字符...... 我该如何避免?

最佳答案

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

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

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

关于cout<<char(int) 转换上的 C++ EOF,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9403122/

相关文章:

c++ - 使用平凡的复制构造函数传递类对象,但没有输出?

c++ - 测量子进程的时间

c - 从文件中精确打印和扫描 (C)

c - 标准输入中的文件结尾

c - 如何检查它是否是 C 中的输入 EOF(ctrl + D)

c++ - UNIX 中的进程间通信

java - java中的字符串到字符数组

c# - 如何将单个字符转换为字符串?

c++ - 读取和复制中间带有 EOF 指示符的文件

c++ - 'MINMAXINFO' : undeclared identifier in MFC application