Crash del programma aiuto.

di il
8 risposte

Crash del programma aiuto.

Salve ragazzi qualcuno sa dirmi come mai questo codice mi crasha?

#include <iostream>
#include <cstring>
using namespace std;

int main()
{
    string LineText_1, LineText_2, LineText_3;
    char *Line_T1, *Line_T2, *Line_T3, *SearchK, SearchKey, SearchKey2;
    int AlfaCounter[25];

    cout << "Inserisci la prima linea di testo:" << endl;
    getline(cin, LineText_1);
    Line_T1 = &LineText_1[0];

    cout << "Inserisci la seconda linea di testo:" << endl;
    getline(cin, LineText_2);
    Line_T2 = &LineText_2[0];

    cout << "Inserisci la terza linea di testo:"<< endl;
    getline(cin, LineText_3);
    Line_T3 = &LineText_3[0];

    for(int c = 0; c <25; c++)
    {
        AlfaCounter[c] = 0;
    }

    for(char c = 65; c <= 90;c++)
    {
       char c2 = c+32;
       int x = 0;
       SearchKey = c;
       SearchKey2 = c2;

       for(char *SearchPtr = strchr(Line_T1, SearchKey), *SearchPtr2 = strchr(Line_T1, SearchKey2); (SearchPtr != NULL||SearchPtr2!=NULL) ; SearchPtr = strchr(SearchPtr+1, SearchKey), SearchPtr2 = strchr(SearchPtr2+1, SearchKey2));
       {

           AlfaCounter[x]++;
       }

       x++;

    }



    return 0;
}
Da un po' di debugging mi sembra di capire che il problema sia in queste righe di codice:

       for(char *SearchPtr = strchr(Line_T1, SearchKey), *SearchPtr2 = strchr(Line_T1, SearchKey2); (SearchPtr != NULL||SearchPtr2!=NULL) ; SearchPtr = strchr(SearchPtr+1, SearchKey), SearchPtr2 = strchr(SearchPtr2+1, SearchKey2));
       {

           AlfaCounter[x]++;
       }
Ma non capisco proprio quale sia il problema..

8 Risposte

  • Re: Crash del programma aiuto.

    Alla fine del for hai messo un ; per cui non esegue l'istruzione sottostante. Non credo che questo sia il motivo del crash; devo dire che il tuo codice è molto fumoso, magari semplificandolo potresti individuare facilmente il problema (ad esempio, le due strchr che hai inserito nel for perchè non le metti fuori dal for, così com'è adesso non si capisce niente!).
  • Re: Crash del programma aiuto.

    A parte il ; il crash è causato da

    SearchPtr = strchr(SearchPtr + 1, SearchKey)

    in cui, in un certo momento, SearchPtr è NULL.

    Ma sul perché, non seguendo la tua logica, non posso dirti le cause ...

    In effetti la for andrebbe semplificata e chiarita.
  • Re: Crash del programma aiuto.

    A parte gli errore, io non riesco a capire cosa stai cercando di ottenere. Me lo spieghi?
  • Re: Crash del programma aiuto.

    Sto cercando di ottenere il totale delle occorrenze di ogni lettera dell'alfabeto, le lettere maiuscole e minuscole dovrebbero essere uguali ai fini del conteggio.
  • Re: Crash del programma aiuto.

    Alla fine ho risolto usando questo codice:
    
    #include <iostream>
    #include <cstring>
    using namespace std;
    
    int main()
    {
        string LineText_1, LineText_2, LineText_3;
        char *Line_T1, *Line_T2, *Line_T3, SearchKey, SearchKey2;
        int AlfaCounter[26], x=0;
    
        cout << "Inserisci la prima linea di testo:" << endl;
        getline(cin, LineText_1);
        Line_T1 = &LineText_1[0];
    
        cout << "Inserisci la seconda linea di testo:" << endl;
        getline(cin, LineText_2);
        Line_T2 = &LineText_2[0];
    
        cout << "Inserisci la terza linea di testo:"<< endl;
        getline(cin, LineText_3);
        Line_T3 = &LineText_3[0];
    
        for(int c = 0; c <26; c++)
        {
            AlfaCounter[c] = 0;
        }
    
        for(char charapter = 65; charapter <=90;charapter++)
        {
    
            SearchKey = charapter;
            SearchKey2 = charapter+32;
    
            for(char *SearchPtr = strchr(Line_T1, SearchKey); SearchPtr!= NULL; SearchPtr = strchr(SearchPtr+1, SearchKey))
            {
                AlfaCounter[x]++;
            }
            for(char *SearchPtr = strchr(Line_T1, SearchKey2); SearchPtr!= NULL; SearchPtr = strchr(SearchPtr+1, SearchKey2))
            {
                AlfaCounter[x]++;
            }
    
            for(char *SearchPtr = strchr(Line_T2, SearchKey); SearchPtr!= NULL; SearchPtr = strchr(SearchPtr+1, SearchKey))
            {
                AlfaCounter[x]++;
            }
    
            for(char *SearchPtr = strchr(Line_T2, SearchKey2); SearchPtr!= NULL; SearchPtr = strchr(SearchPtr+1, SearchKey2))
            {
                AlfaCounter[x]++;
            }
    
            for(char *SearchPtr = strchr(Line_T3, SearchKey); SearchPtr!= NULL; SearchPtr = strchr(SearchPtr+1, SearchKey))
            {
                AlfaCounter[x]++;
            }
            for(char *SearchPtr = strchr(Line_T3, SearchKey2); SearchPtr!= NULL; SearchPtr = strchr(SearchPtr+1, SearchKey2))
            {
                AlfaCounter[x]++;
            }
    
            x++;
        }
    
        x = 0;
        for(char c = 65; c<=90; c++)
        {
            char c2 = c+32;
            cout << c << "/" << c2 << ":        " << AlfaCounter[x] << endl;
            x++;
        }
    
        return 0;
    }
    
    Tuttavia mi irritano molto tutti quei cicli for che ho utilizzato se qualcuno ha un' idea su come snellire il tutto mi farebbe piacere ascoltarla.
  • Re: Crash del programma aiuto.

    Non so bene come sia implementata la funzione strchr, in ogni caso scorri la stringa molte volte quando invece basterebbe farlo una sola volta.

    Potresti fare qualcosa del genere per esempio:
    #include <iostream>
    #include <string>
    
    using namespace std;
    
    int main()
    {
        string s;
        int v[26] = {};
        unsigned int i;
        cout << "INSERISCI STRINGA:" << endl;
        getline(cin, s);
        for(i = 0; i < s.size(); ++i)
        {
            if(s[i] >= 'A' && s[i] <= 'Z')
            {
                ++v[s[i] - 'A'];
            }
            else if(s[i] >= 'a' && s[i] <= 'z')
            {
                ++v[s[i] - 'a'];
            }
        }
        for(i = 0; i < 26; ++i)
        {
            cout << char(i + 'A') << ": " << v[i] << endl;
        }
    }
  • Re: Crash del programma aiuto.

    Una variante della soluzione di Nippolo potrebbe essere questa:
    #include <iostream>
    #include <string>
    using namespace std;
    
    int main() {
        string s;
        int v[256] = {};
        unsigned int i;
    
        cout << "INSERISCI STRINGA:" << endl;
        getline(cin, s);
    
        for( i=0; i<s.size(); ++i )
            ++v[(unsigned char)s[i]];
    
        for( i='A'; i<='Z'; ++i )
            cout << (char)i << ": " << v[i]+v[i+32] << endl;
    }
    
  • Re: Crash del programma aiuto.

    Vi ringrazio per le risposte ma mi sono dimenticato di dire che il programma prende in input piu' di una linea di testo e che sono obbligato ad utilizzare la funzione strchr poichè lo richiede l'esercizio.
Devi accedere o registrarti per scrivere nel forum
8 risposte