Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 12
  1. #1
    Utente di HTML.it
    Registrato dal
    Mar 2006
    Messaggi
    49

    [C]Vettori di stringhe.

    Cosa sto sbagliando?
    Vorrei prendere 4 stringhe da tastiera e ristamparle.

    codice:
    #include <stdio.h>
    
    int main(void){
    
    char *vett[4];
    int i;
    
    	for(i=0; i<4; i++){
    		printf("Inserisci l'elemento numero %d:", i);
    		scanf("%s", vett[i]);
    	}
    	for(i=0; i<4; i++){
    		printf("\nElemento %d = %s",i, vett[i]);
    	}
    }
    Compila, ma nell'eseguire mi da questo errore:Segmentation fault (core dumped)

  2. #2
    non vedo alcuna allocazione di memoria... sarà forse questo il problema?

  3. #3
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: [C]Vettori di stringhe.

    Originariamente inviato da xglobusx
    Cosa sto sbagliando?
    Vorrei prendere 4 stringhe da tastiera e ristamparle.
    char *vett[4]; definisce solamente un array che contiene 4 puntatori a char.
    Non definisce alcun spazio vero e proprio per i caratteri delle stringhe!
    La soluzione più semplice è quella di allocare delle memoria con malloc() per ogni stringa.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  4. #4
    Utente di HTML.it
    Registrato dal
    Mar 2006
    Messaggi
    49
    Non credo sia necessario allocare della memoria.
    Se io inizializzo il vettore con

    char *vett[4] = {"Ciao", "Buongiorno", "Salve", "Arrivederci"};

    non da alcun errore e stampa il contenuto del vettore correttamente.

  5. #5
    innanzi tutto non lo vedo inizializzato come dici tu...

    poi secondo me puoi risolvere così:

    Codice PHP:
    #include <stdio.h>

    #define DIM 4

    int main(void){

    char **vett;
    int i;

        for(
    i=0i<DIMi++)
           
    vett[i] = malloc(sizeof(char));

        for(
    i=0i<DIMi++){
            
    printf("Inserisci l'elemento numero %d:"i);
            
    scanf("%s"vett[i]);
        }
        for(
    i=0i<DIMi++){
            
    printf("\nElemento %d = %s",ivett[i]);
        }
        
    printf("\n\n");


  6. #6
    Originariamente inviato da xglobusx
    Non credo sia necessario allocare della memoria.
    Se io inizializzo il vettore con

    char *vett[4] = {"Ciao", "Buongiorno", "Salve", "Arrivederci"};

    non da alcun errore e stampa il contenuto del vettore correttamente.
    Certo, perché in questo caso il compilatore aggiunge le stringhe alla tabella delle stringhe e assegna i puntatori all'area di memoria da lui automaticamente allocata ai vari elementi del vettore di puntatori.
    vett[i] = malloc(sizeof(char));
    Cioè, per ciascun elemento tu allochi un singolo byte?
    Semmai una soluzione (la più diffusa) è di allocare staticamente la memoria in questione; al posto di
    codice:
    char *vett[4];
    metti
    codice:
    char vett[4][256];
    .
    A scanso di buffer overflow eventualmente modifica la scanf in questo modo:
    codice:
    scanf("%255s", vett[i]);
    .
    Amaro C++, il gusto pieno dell'undefined behavior.

  7. #7
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Originariamente inviato da xglobusx
    Non credo sia necessario allocare della memoria.
    E dove li memorizzi i caratteri che fanno parte delle stringhe?

    Io invece penso che *sia necessario* allocare la memoria ... e il segmentation fault te lo ricorda ...

    Originariamente inviato da xglobusx
    Se io inizializzo il vettore con

    char *vett[4] = {"Ciao", "Buongiorno", "Salve", "Arrivederci"};

    non da alcun errore e stampa il contenuto del vettore correttamente.
    Questo perche', in questo caso, e' il compilatore, staticamente, ad allocare la memoria necessaria per memorizzare le stringhe.

    E c'e' differenza con l'allocazione *dinamica*, per la quale non sai in partenza quanto sia la memoria richiesta ...

  8. #8
    per stare sicuro al 100% fai l'allocazione dinamica come se fosse una matrice...

    Codice PHP:
    #include <stdio.h>

    #define DIM 4
    #define NUM 1

    int main(void){

    char **vett;
    int i;


        
    vett=( char ** )mallocNUM sizeof(char *));
           for(
    i=0;i<DIM;i++)    {

                
    vett[i]=( char * )mallocDIM sizeof(char));

        }

        for(
    i=0i<DIMi++)
           
    vett[i] = malloc(sizeof(char));

        for(
    i=0i<DIMi++){
            
    printf("Inserisci l'elemento numero %d:"i);
            
    scanf("%s"vett[i]);
        }
        for(
    i=0i<DIMi++){
            
    printf("\nElemento %d = %s",ivett[i]);
        }
        
    printf("\n\n");

    e vai alla grande, infatti nel primo caso se inserisci una stringa molto grande va in seg fault!

  9. #9
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da Vincent
    Codice PHP:
    #include <stdio.h>

    #define DIM 4
    #define NUM 1

    int main(void){

    char **vett;
    int i;


        
    vett=( char ** )mallocNUM sizeof(char *));
           for(
    i=0;i<DIM;i++)    {

                
    vett[i]=( char * )mallocDIM sizeof(char));

        }

        for(
    i=0i<DIMi++)
           
    vett[i] = malloc(sizeof(char));

        for(
    i=0i<DIMi++){
            
    printf("Inserisci l'elemento numero %d:"i);
            
    scanf("%s"vett[i]);
        }
        for(
    i=0i<DIMi++){
            
    printf("\nElemento %d = %s",ivett[i]);
        }
        
    printf("\n\n");

    Un po' confuso come sorgente .... hai fatto un ciclo for (il secondo) che a mio avviso non serve.
    Il primo array (quello dei puntatori) l'hai allocato di NUM elementi (invece di DIM) e il secondo di DIM caratteri (invece di NUM caratteri, che dovrebbe essere comunque abbastanza grande).
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  10. #10
    Utente di HTML.it
    Registrato dal
    Mar 2006
    Messaggi
    49
    è vero bisogna allocare, grazie

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.