Oto mój kod:

#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;
}

Program liczy litery w podanych n wierszach tekstu. Litery, które nie istnieją, są pomijane. Po uruchomieniu w konsoli wygląda dobrze, ale wiem, że przed znakami są znaki EOF... Jak mogę tego uniknąć?

0
noisy cat 23 luty 2012, 01:14

3 odpowiedzi

Najlepsza odpowiedź

Indeksy tablicy są uruchamiane od 0 do N-1, gdzie N to liczba elementów: wszystkie pętle for uzyskują dostęp o 1 za dużo, co skutkuje niezdefiniowanym zachowaniem. Zmień warunki zakończenia w pętlach for na i < 26.

Kolejna drobna uwaga, aby uprościć inicjalizację duze i male deklarujesz je jako:

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

To ustawia wszystkie elementy na 0, co oznacza, że ​​możesz usunąć dwie pętle for, które obecnie to robią.

2
hmjd 23 luty 2012, 01:26

Masz przepełnienie bufora (w rzeczywistości kilka z nich). Deklarujesz dwie tablice o rozmiarze 26 (duze i male), ale następnie zapisujesz dane w 27 indeksach (od 0 do 26).

Ponieważ jest to poza granicami bufora, nadepniesz na inną pamięć, co powoduje błędne, nieprzewidywalne zachowanie. Standard C++ nazywa to niezdefiniowanym zachowaniem: gdy to zrobisz, może się zdarzyć absolutnie wszystko: Twój program może się zawiesić, może zawierać subtelne błędy, takie jak ten, może wydawać się, że działa poprawnie, a nawet może wymazać Twój dysk twardy (choć jest to raczej mało prawdopodobne).

Aby to naprawić, zamień wszystkie swoje 27-tki na 26-tki; możesz również zwiększyć rozmiar tablicy do 27, ale wtedy wydrukowanie char(26+'a') dałoby {, co prawdopodobnie nie jest twoim zamiarem.

3
Adam Rosenfield 23 luty 2012, 02:00

Powinieneś sprawdzić następujące czynności:

if ( cin.get(temp) )
{
  // read was ok
}
else
{
  // eof or other issue on read
}
2
Naszta 23 luty 2012, 01:19