Stampare frasi casuali e segmentation fault

di il
8 risposte

Stampare frasi casuali e segmentation fault

Ciao! Sono alle prese con le funzioni per manipolare le stringhe, dovrei scrivere un programma che generi delle frasi casuali usando le parole contenute nei vettori di puntatori.
Il codice mi sembra corretto, il problema è che quando compilo restituisce un errore.
Se provo ad usare il debugger e avanzo linea per linea, quando arrivo al comando
strcat(v, strcat(noun[rand()%5], " "));
mi restituisce un messaggio con scritto "segmentation fault".
Qualche consiglio utile?
Grazie!
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>
#include <ctype.h>

int main()
{
    char *article[5]={"the", "a", "one", "some", "any"};
    char *noun[5]={"boy", "girl", "dog", "town", "car"};
    char *verb[5]={"drove", "jumped", "ran", "walked", "skipped"};
    char *prep[5]={"to", "from", "over", "under", "on"};

    char v[40];
    
    srand(time(NULL));

    
    sprintf(v, "%s ", article[rand()%5]);
    
    strcat(v, strcat(noun[rand()%5], " "));
    
    strcat(v, strcat(verb[rand()%5], " "));
    
    strcat(v, strcat(prep[rand()%5], " "));
    
    strcat(v, strcat(noun[rand()%5], "\n"));

    printf("%s", v);







        return 0;
}

8 Risposte

  • Re: Stampare frasi casuali e segmentation fault

    Se ti restituisce un errore di segmentation Fault, significa che non ti restituisce un errore di compilazione, in quanto segmentation fault è un errore causato da avere letto ho scritto in aree di memoria non dedicate al programma, cosa che implica che il programma Funziona correttamente. Quindi almeno deciditi se da errore di compilazione o no.

    Inoltre deciditi se la frase La devi generare ed inserire in una stringa interna al programma, o se la devi solo stampare. Nel secondo caso è inutile utilizzare la libreria String h, cosí come non è necessaria nemmeno la ctype, ne la time.h o la stdlib.h

    Prima di metterti a scrivere codice Stabilisci cosa tale codice deve fare
  • Re: Stampare frasi casuali e segmentation fault

    Secondo me è la seconda strcat() che ti fa problema

    Dove tenti di scrivere dentro nello array di stringhe noun()

    Che è formato da stringhe a lunghezza fissa

    Prova a pensare dove andrebbe quello spazio
  • Re: Stampare frasi casuali e segmentation fault

    StandardOil ha scritto:


    Secondo me è la seconda strcat() che ti fa problema

    Dove tenti di scrivere dentro nello array di stringhe noun()

    Che è formato da stringhe a lunghezza fissa

    Prova a pensare dove andrebbe quello spazio
    Ti ringrazio per il consiglio, ho provato a risolvere scorporando i due strcat in questo modo:
    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    #include <string.h>
    #include <ctype.h>

    int main()
    {
    char *article[5]={"the", "a", "one", "some", "any"};
    char *noun[5]={"boy", "girl", "dog", "town", "car"};
    char *verb[5]={"drove", "jumped", "ran", "walked", "skipped"};
    char *prep[5]={"to", "from", "over", "under", "on"};

    char v[40];

    srand(time(NULL));


    sprintf(v, "%s ", article[rand()%5]);

    strcat(v, noun[rand()%5]);

    strcat(v, " ");

    strcat(v, verb[rand()%5]);

    strcat(v, " ");

    strcat(v, prep[rand()%5]);

    strcat(v, " ");

    strcat(v, noun[rand()%5]);


    printf("%s", v);







    return 0;
    }
    e in effetti funziona.
    Tu pensavi ad una cosa del genere o avevi ancora un'idea diversa?

    EDIT
    Sono riuscito a riscriverlo in modo più compatto
    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    #include <string.h>
    #include <ctype.h>
    
    int main()
    {
        char *article[5]={"the", "a", "one", "some", "any"};
        char *noun[5]={"boy", "girl", "dog", "town", "car"};
        char *verb[5]={"drove", "jumped", "ran", "walked", "skipped"};
        char *prep[5]={"to", "from", "over", "under", "on"};
    
        char v[40];
    
        srand(time(NULL));
    
    
        sprintf(v, "%s", article[rand()%5]);
    
        strcat(strcat(v, " "), noun[rand()%5]);
    
        strcat(strcat(v, " "), verb[rand()%5]);
    
        strcat(strcat(v, " "), prep[rand()%5]);
    
        strcat(strcat(v, " "), noun[rand()%5]);
    
        printf("%s", v);
    
    return 0;
    }
    
  • Re: Stampare frasi casuali e segmentation fault

    silente ha scritto:


    Se ti restituisce un errore di segmentation Fault, significa che non ti restituisce un errore di compilazione, in quanto segmentation fault è un errore causato da avere letto ho scritto in aree di memoria non dedicate al programma, cosa che implica che il programma Funziona correttamente. Quindi almeno deciditi se da errore di compilazione o no.

    Inoltre deciditi se la frase La devi generare ed inserire in una stringa interna al programma, o se la devi solo stampare. Nel secondo caso è inutile utilizzare la libreria String h, cosí come non è necessaria nemmeno la ctype, ne la time.h o la stdlib.h

    Prima di metterti a scrivere codice Stabilisci cosa tale codice deve fare
    Per quanto riguarda stdlib.h viene inclusa automaticamente da codeblocks che è l'ambiente di sviluppo su cui lavoro, la ctype mi serve per il punto dopo del problema e la string.h mi serviva per strcmp dato che mi veniva espressamente chiesto dal problema.
    Detto questo, dal momento che la tua risposta non è stata di alcun aiuto, se devi utilizzare le domande degli altri per dare mostra della tua saccenza rivolgiti altrove, grazie. Buona giornata
  • Re: Stampare frasi casuali e segmentation fault

    FrancoForte ha scritto:


    Detto questo, dal momento che la tua risposta non è stata di alcun aiuto, se devi utilizzare le domande degli altri per dare mostra della tua saccenza rivolgiti altrove, grazie. Buona giornata
    Eccone un altro che si sente ferito nell'orgoglio. Ti ha solo chiesto di specificare meglio perché hai parlato di errore di compilazione e invece era un errore a runtime...

    Ma rispondete così piccati anche quando andate dal meccanico e vi viene chiesto di spiegare meglio il problema?
  • Re: Stampare frasi casuali e segmentation fault

    @FrancoForte ... il problema deriva dal fatto che le stringhe che utilizzi sono delle costanti e lo strcat con lo spazio " " non può essere eseguito (sicuro che il codice originale dell'esempio è questo?)

    Puoi scrivere
    
    	char article[][15] = { "the", "a", "one", "some", "any" };
    	char noun[][15] = { "boy", "girl", "dog", "town", "car" };
    	char verb[][15] = { "drove", "jumped", "ran", "walked", "skipped" };
    	char prep[][15] = { "to", "from", "over", "under", "on" };
    
    oppure lasci la prima parte come prima e correggi il resto in questo modo
    
    	sprintf(v, "%s ", article[rand() % 5]);
    
    	strcat(v, noun[rand() % 5]);
    	strcat(v, " ");
    
    	strcat(v, verb[rand() % 5]);
    	strcat(v, " ");
    
    	strcat(v, prep[rand() % 5]);
    	strcat(v, " ");
    
    	strcat(v, noun[rand() % 5]);
    	strcat(v, "\n");
    
    	printf("%s", v);
    
    P.S. Anche se FrancoForte ha eccessivamente reagito mi sembra che anche @silente potrebbe articolare meglio le risposte per evitare discussioni ... "deciditi" ... "deciditi" ... non sono termini didatticamente validi e possono ingenerare flame ... fra l'altro, decidere se il problema è in compilazione o (senza h) a runtime è del tutto irrilevante dato che è chiaro che il seg fault si manifesta solo a runtime ed, evidentemente, all'OP non è del tutto chiaro.
  • Re: Stampare frasi casuali e segmentation fault

    @oregon ti ringrazio, sono infatti arrivato alla tua seconda soluzione riuscendo a risolvere il problema, grazie per l'interesse!
  • Re: Stampare frasi casuali e segmentation fault

    oregon ha scritto:


    P.S. Anche se FrancoForte ha eccessivamente reagito mi sembra che anche @silente potrebbe articolare meglio le risposte per evitare discussioni ... "deciditi" ... "deciditi" ... non sono termini didatticamente validi e possono ingenerare flame ... fra l'altro, decidere se il problema è in compilazione o (senza h) a runtime è del tutto irrilevante dato che è chiaro che il seg fault si manifesta solo a runtime ed, evidentemente, all'OP non è del tutto chiaro.
    Certo che il problema è evidente, ma così come alcune cose non sono chiare all'OP potrebbero non essere chiare ad altri utenti, se poi certe parole non piacciono si potrebbe anche sorvolare invece di rispondere piccati (a che pro poi?) che pare ormai la norma. Tanto se si è educati la soluzione prima o poi arriva. Vabbé contenti loro
Devi accedere o registrarti per scrivere nel forum
8 risposte