c segmentation fault[RISOLTO]

Linguaggi di programmazione: php, perl, python, C, bash e tutti gli altri.
Scrivi risposta
shivi_ubuntu
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 695
Iscrizione: venerdì 2 settembre 2011, 22:31

c segmentation fault[RISOLTO]

Messaggio da shivi_ubuntu »

non so cosa sto sbagliando non riesco più capire mi da sempre errore di segmentation fault

Codice: Seleziona tutto

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>

int main()
{

    char mess[78] = "vediamo quanti spazi ci sono nella stringa e vediamo quante lettere MAIUSCOLE";

    int countSpace = 0;

    int countLettersUpperCase = 0;


    int i,j = 0;


   for(i; strlen(mess); i++){

       if(mess[i] == ' '){

           countSpace += 1;
        }else if(isupper(mess[i])){

           countLettersUpperCase += 1;
        }
    }


    printf("\t\tNella stringa ci sono %d spazi bianchi \n",countSpace);
    printf("\t\tNella stringa ci sono %d lettere maiuscole \n",countLettersUpperCase);

    return 0;
}
Ultima modifica di shivi_ubuntu il mercoledì 25 giugno 2014, 22:30, modificato 1 volta in totale.
OverMe
Prode Principiante
Messaggi: 185
Iscrizione: sabato 13 gennaio 2007, 22:26

Re: c segmentation fault

Messaggio da OverMe »

"i" non è inizializzato.
La condizione del "for" è sbagliata.
shivi_ubuntu
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 695
Iscrizione: venerdì 2 settembre 2011, 22:31

Re: c segmentation fault

Messaggio da shivi_ubuntu »

lho provato a inizializzare i ma niente sempre segmentation fault
Avatar utente
Actarus5
Prode Principiante
Messaggi: 220
Iscrizione: mercoledì 3 luglio 2013, 17:15
Desktop: Mate
Distribuzione: Fedora
Località: Abutalabashuneba

Re: c segmentation fault

Messaggio da Actarus5 »

OverMe ha scritto:"i" non è inizializzato.
La condizione del "for" è sbagliata.
Come ti è già stato detto c'è anche un errore nella condizione del for...
Non dovrebbe essere qualcosa tipo "i < ..." ?
"An extremely helpful console message: “SPANK! SPANK! SPANK! Naughty programmer!”. Really, I’m not joking about that one."
shivi_ubuntu
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 695
Iscrizione: venerdì 2 settembre 2011, 22:31

Re: c segmentation fault

Messaggio da shivi_ubuntu »

qui c'è il codice senza quei errori ma non capisco perchè ancora trovo segmentation fault io uso codeblocks

Codice: Seleziona tutto


#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>

int main()
{

    char mess[78] = "vediamo quanti spazi ci sono nella stringa e vediamo quante lettere MAIUSCOLE";

    int countSpace = 0;

    int countLettersUpperCase = 0;

    int i = 0;
    int j = 0;

   for(i; (int)strlen(mess); i++){

       if(mess[i] == ' '){

           countSpace += 1;
        }else if(isupper(mess[i])){

           countLettersUpperCase += 1;
        }
    }

    printf("\t\tNella stringa ci sono %d spazi bianchi \n",countSpace);
    printf("\t\tNella stringa ci sono %d lettere maiuscole \n",countLettersUpperCase);

    return 0;
}


Avatar utente
Actarus5
Prode Principiante
Messaggi: 220
Iscrizione: mercoledì 3 luglio 2013, 17:15
Desktop: Mate
Distribuzione: Fedora
Località: Abutalabashuneba

Re: c segmentation fault

Messaggio da Actarus5 »

L'IDE in questo caso ha poca importanza ed anche il compilatore...
Inanzitutto il cast ad int che stai usando è inutile in questo caso, più che altro dovresti concentrarti su ciò che hai scritto in quel ciclo for, perché gli errori ci sono ancora ( mettilo nel for i=0, è più comodo no? Almeno non ti dimentichi di inizializzare la variabile)...
Ma ciò che fa andare il programma in seg fault è la condizione del ciclo for, quindi ti chiedo.. Potresti dirmi a parole cosa intendi fare ? Perché ora come ora quel for è un ciclo infinito, la condizione che hai inserito è sempre vera indipendentemente dal valore di i...
"An extremely helpful console message: “SPANK! SPANK! SPANK! Naughty programmer!”. Really, I’m not joking about that one."
shivi_ubuntu
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 695
Iscrizione: venerdì 2 settembre 2011, 22:31

Re: c segmentation fault

Messaggio da shivi_ubuntu »

Io sto imparando i linguaggi di programmazione da casa quel casting che sto facendo un letto in un libro di c scaricato da google forse scrittore ha sbagliato spiegare cmq con quel programma cerco solo di contare gli spazi bianchi e lettere maiuscole e tutto qui ieri questo programma mi andava benissimo poi stamattina non so cosa ho sbagliato mi da quel errore di seg fault
shivi_ubuntu
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 695
Iscrizione: venerdì 2 settembre 2011, 22:31

Re: c segmentation fault

Messaggio da shivi_ubuntu »

Actarus5 [url=http://forum.ubuntu-it.org/viewtopic.php?p=4605525#p4605525][img]http://forum.ubuntu-it.org/images/icons/icona-cita.gif[/img][/url] ha scritto:L'IDE in questo caso ha poca importanza ed anche il compilatore...
Inanzitutto il cast ad int che stai usando è inutile in questo caso, più che altro dovresti concentrarti su ciò che hai scritto in quel ciclo for, perché gli errori ci sono ancora ( mettilo nel for i=0, è più comodo no? Almeno non ti dimentichi di inizializzare la variabile)...
Ma ciò che fa andare il programma in seg fault è la condizione del ciclo for, quindi ti chiedo.. Potresti dirmi a parole cosa intendi fare ? Perché ora come ora quel for è un ciclo infinito, la condizione che hai inserito è sempre vera indipendentemente dal valore di i...
a parole ti dico che fai senza rispondermi che fai paura nella tua conoscenza del linguaggio c . il mio errore lho già risolto da solo era una cosa piccola che alla fine nessuno di voi non si è accorto poi di quel casting che mi parli vai leggere qualche buon libro sul linguaggio c cosi capisci perchè uso buongiorno
shivi_ubuntu
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 695
Iscrizione: venerdì 2 settembre 2011, 22:31

Re: c segmentation fault[RISOLTO]

Messaggio da shivi_ubuntu »

gia risolto tutto grazie lo stesso
Avatar utente
Actarus5
Prode Principiante
Messaggi: 220
Iscrizione: mercoledì 3 luglio 2013, 17:15
Desktop: Mate
Distribuzione: Fedora
Località: Abutalabashuneba

Re: c segmentation fault[RISOLTO]

Messaggio da Actarus5 »

Sul fatto che debba studiare anche io non c'è dubbio, però onestamente penso di aver già appreso l'utilizzo di strlen :D
Detto questo puoi spiegarmi perché quel cast serve? Ti spiego il mio punto di vista, perché in nessun libro, neanche il K&R, ovvero la Bibbia del C avevo mai visto questa pratica...
Questo è il prototipo della funzione strlen: size_t strlen(const char *str)
Quindi strlen restituisce un dato di tipo size_t...
Se ti disturba confrontare un int con size_t non sarebbe meglio dichiare i come size_t a questo punto?

Un ultimo consiglio: scrivendo for(i=0;i<strlen(mess);i++) stai calcolando la lunghezza della stringa ad ogni iterazione del ciclo e puoi farne a meno, calcolandola prima del ciclo e salvando il valore in una variabile... Potresti anche risolvere l'esercizio anche senza conoscere la lunghezza della stringa effettivamente :sisi:
"An extremely helpful console message: “SPANK! SPANK! SPANK! Naughty programmer!”. Really, I’m not joking about that one."
shivi_ubuntu
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 695
Iscrizione: venerdì 2 settembre 2011, 22:31

Re: c segmentation fault[RISOLTO]

Messaggio da shivi_ubuntu »

non posso garantire guida che leggi te io leggo stessa guida e impariamo le stesse cose ognuno ha il suo libro da dove impara importante che fai cast cosi ti restituisce numero int della lunghezza dei caratteri della stringa e non devi preoccuparti troppo per renderti le cose difficili per te dopo ti metto il link guida che ce lho io cosi vedi . poi la funzione strlen è molto sicura di sizeof ti restituisce numero di byte invece strlen conta caratteri di una stringa compreso il carattere '\0' quando fai cast al ciclo for come se riceve lunghezza dei caratteri della stringa e ritorna numero int . quindi non hai nessun tipo di complicazione
gila75
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 2739
Iscrizione: mercoledì 16 gennaio 2013, 17:28
Desktop: ubuntu-2d
Distribuzione: Ubuntu 12.04.2 LTS i686
Località: Airuno(Lecco)

Re: c segmentation fault[RISOLTO]

Messaggio da gila75 »

Anche secondo me il cast è inutile e non è necessario fare e tantomeno ripetere il conteggio della stringa con strlen.
Volendo, si può anche fare a meno di scomodare la libreria ctype.h , basta un po' "scartabellare " il codice ascii. Ma quello è solo un di più, ctype esiste ed e giusto usarla.
Io avrei risolto così, con un ciclo infinito for fino a trovare il terminatore stringa '\0'.
Io ho usato il for, ma va benissimo anche il costrutto while

Codice: Seleziona tutto

#include <stdio.h>
#include <stdlib.h>
#include <string.h>


int main()
{

    char mess[100] = "ABC a ZX ";
    int countSpace = 0;
    int countLettersUpperCase = 0;
    int i=0;
    for (;;)
    {
        if (mess[i]==' ')
            countSpace++;
        if (mess[i]>=65 && mess[i]<=90)
            countLettersUpperCase++;
        if (mess[i]=='\0')
            break;
        i++;
    }

    printf ("lettere maiuscole n° %d\n",countLettersUpperCase);
    printf ("spazi n°             %d\n", countSpace);
            
    return 0;
}
shivi_ubuntu
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 695
Iscrizione: venerdì 2 settembre 2011, 22:31

Re: c segmentation fault[RISOLTO]

Messaggio da shivi_ubuntu »

funziona in tutti e due casi magari il mio codice è gestito diverso dal tuo però ha lo stesso risultato senza errori e senza warning testao su linux e windows . apprezzo il tuo consiglio grazie mille
Scrivi risposta

Ritorna a “Programmazione”

Chi c’è in linea

Visualizzano questa sezione: 0 utenti iscritti e 3 ospiti