Visualizzazione dei risultati da 1 a 4 su 4
  1. #1
    Utente di HTML.it
    Registrato dal
    Feb 2005
    Messaggi
    13

    [ANSI C] dubbi su array di stringhe

    ciao a tutti
    non riesco a capire alcune cose sugli array di stringhe
    in un programma ho il seguente campo all'interno di una struct
    codice:
    char **solutions
    che è un array di puntatori a stringhe(se ho capito bene )

    per inizializzarlo posso fare
    codice:
    /*se so quali sono le stringhe*/
    struct.solutions = (char**)malloc(n*sizeof(char*));
    struct.solutions[x] = "stringa";
    
    /*se la stringa la prendo da un'altra stringa*/
    struc.solutions = (char**)malloc(n*sizeof(char));
    struct.solutions[x] = (char*)malloc(m*sizeof(char));
    strcpy(struct.solutions[x],stringa);
    giusto fin qui?

    ora il mio problema sorge quando devo stampare le stringhe. Uso Netbeans e con questo codice
    codice:
    for(i=0,i<n;i++)
         printf("%s\n",struct.solutions[i]);
    il programma si blocca. Il problema è il come dichiaro le stringhe o in come le stampo?
    grazie
    ...liberation of the human mind and the dominion of religion; the liberation of the human body from the dominion of property; liberation from shackles and restraint of government. It stands for social order based on the free grouping of individuals... (E.G.)

  2. #2
    al mio parere al posto di
    codice:
    struct.solutions[x] = "stringa";
    dovresti fare
    codice:
    strcpy(struct.solutions[x], "stringa\0");
    se non sbaglio, ma non ricordo bene, printf %s da problemi se la stringa che deve stampare non ha appunto un terminatore di stringa. In questo senso array di caratteri != stringa.

    ricorda quindi che anche quando usi le malloc devi allocare sempre per "lunghezza_stringa+1" in modo da avere lo spazio per il terminatore

  3. #3
    Originariamente inviato da Celebron
    al mio parere al posto di
    codice:
    struct.solutions[x] = "stringa";
    dovresti fare
    codice:
    strcpy(struct.solutions[x], "stringa\0");
    se non sbaglio, ma non ricordo bene, printf %s da problemi se la stringa che deve stampare non ha appunto un terminatore di stringa.
    Hai ragione su strcpy: assegnando con l'operatore =, assegni l'indirizzo di "stringa" all'indirizzo di stringa, il che non dovrebbe essere un problema, ma lo diventerebbe nel caso in cui provi a modificare quella stringa, in quanto non è modificabile.
    Una stringa const come "stringa" il compilatore automaticamente gli aggiunge il terminatore alla fine quindi non è un problema per printf: il problema semmai potrebbe essere un eventuale spazio, che printf considera come terminatore.
    codice:
    /*se so quali sono le stringhe*/
    struct.solutions = (char**)malloc(n*sizeof(char*));
    struct.solutions[x] = "stringa";
    Attento in questo modo la stringa avrà dimensione max di "stringa"+1 caratteri e dipendentemente dal compilatore, può essere un errore modificare quell'area di memoria.
    Consiglio di usare sempre il secondo metodo allocando n char e copiando la stringa con strcpy

  4. #4
    Utente di HTML.it
    Registrato dal
    Feb 2005
    Messaggi
    13
    Originariamente inviato da Celebron
    al mio parere al posto di
    codice:
    struct.solutions[x] = "stringa";
    dovresti fare
    codice:
    strcpy(struct.solutions[x], "stringa\0");
    Quindi ogni volta che dichiaro esplicitamente il secondo argomento di strcpy devo mettere anche il terminatore di linea. buono a sapersi.


    Originariamente inviato da lolide
    Attento in questo modo la stringa avrà dimensione max di "stringa"+1 caratteri e dipendentemente dal compilatore, può essere un errore modificare quell'area di memoria.
    Consiglio di usare sempre il secondo metodo allocando n char e copiando la stringa con strcpy
    perciò se io volessi usare una stringa *temp che nel corso del programma dovrà contenere stringhe di diversa lunghezza devo allocare ogni volta la memoria con malloc e poi liberarla con free giusto?
    ...liberation of the human mind and the dominion of religion; the liberation of the human body from the dominion of property; liberation from shackles and restraint of government. It stands for social order based on the free grouping of individuals... (E.G.)

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 © 2024 vBulletin Solutions, Inc. All rights reserved.