C ++ EOF на кастинге cout << char (int) - PullRequest
0 голосов
/ 23 февраля 2012

Вот мой код:

#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 ]

3 голосов
/ 23 февраля 2012

У вас переполнение буфера (на самом деле несколько из них).Вы объявляете два массива размером 26 (duze и male), но затем продолжаете записывать данные в 27 индексов (от 0 до 26).

Поскольку это выходит за пределы буфера, вытопаете на другую память, которая вызывает непредсказуемое, непредсказуемое поведение.Стандарт C ++ называет это неопределенным поведением : как только вы это сделаете, может произойти абсолютно все: ваша программа может аварийно завершиться, у нее могут быть тонкие ошибки, подобные этой, она может работать правильно или даже стереть вашужесткий диск (хотя это довольно маловероятно).

Чтобы это исправить, измените все свои 27 на 26;Вы также можете увеличить размер массива до 27, но тогда распечатка char(26+'a') даст вам {, что, вероятно, не является вашим намерением.

2 голосов
/ 23 февраля 2012

Индексы массива работают от 0 до N-1, где N - количество элементов: все циклы for имеют слишком большой доступ к 1, что приводит к неопределенному поведению.Измените условия завершения для циклов for на i < 26.

Еще одно небольшое замечание: для упрощения инициализации duze и male вы объявляете их как:

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

установите для всех элементов значение 0, то есть вы можете удалить два цикла for, которые в настоящее время делают это.

2 голосов
/ 23 февраля 2012

Вы должны проверить следующее:

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