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ąć?
3 odpowiedzi
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ą.
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.
Powinieneś sprawdzić następujące czynności:
if ( cin.get(temp) )
{
// read was ok
}
else
{
// eof or other issue on read
}
Podobne pytania
Nowe pytania
c++
C ++ to język programowania ogólnego przeznaczenia. Pierwotnie został zaprojektowany jako rozszerzenie C i ma podobną składnię, ale teraz jest to zupełnie inny język. Użyj tego tagu w przypadku pytań dotyczących kodu (który ma zostać) skompilowany za pomocą kompilatora C ++. Użyj znacznika specyficznego dla wersji w przypadku pytań związanych z określoną wersją standardu [C ++ 11], [C ++ 14], [C ++ 17], [C ++ 20] lub [C ++ 23] itp. .