【问题标题】:C++ EOF on cout<<char(int) castingcout<<char(int) 转换上的 C++ EOF
【发布时间】:2012-02-22 21:14:14
【问题描述】:

这是我的代码:

#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 字符...... 如何避免?

【问题讨论】:

  • 注意数组索引从0N-1,其中N是元素的数量:所有for循环访问1太多。
  • “我知道字符前有EOF字符”。你怎么知道的?
  • 哦,没看到 ;)thanx。添加回复,以便我将其标记为正确。 :D
  • @Rob 好吧,相信我,我知道,我 100% 确定:P
  • EOF 字符是什么意思? EOF 不是字符。

标签: c++ char eof


【解决方案1】:

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

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

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

【讨论】:

  • 或者让循环停止在 25 而不是 26
【解决方案2】:

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

另一个小提示,为了简化 duzemale 的初始化,您将它们声明为:

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

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

【讨论】:

  • 8 分钟,由于站点限制,已检查。你是第一个:D
【解决方案3】:

您应该检查以下内容:

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

【讨论】:

    猜你喜欢
    • 2012-10-20
    • 1970-01-01
    • 2021-06-11
    • 1970-01-01
    • 2015-12-18
    • 2015-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多