Visualizzazione dei risultati da 1 a 6 su 6

Discussione: [C] Array di stringhe

  1. #1
    Utente di HTML.it
    Registrato dal
    Nov 2003
    Messaggi
    726

    [C] Array di stringhe

    Avrei bisogno di una spiegazione circa la dichiarazione e la succesiva creazione in memoria di un array di stringhe in quanto proprio non la capisco.

    Per dichiarare una array di char mi sono rifatti ad uno dei parametri del main (*argv[]), ma francamente non capisco come è stata pensata questa cosa.
    Che sucede in memoria?
    Come so la dimensione massima che può avere una stringa??


    Grazie

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,466
    Avrai un array di puntatori. Ogni elemento di questo array (ogni puntatore) punterà ad una zona di memoria in cui verra' allocata la stringa.

    Ogni stringa avra' lunghezza diversa, secondo quanto ne hai allocata ...

    argv[0] e' un puntatore che punta ad una stringa -> ....... \0 terminata con zero binario
    argv[1] e' un puntatore che punta ad una stringa -> ....... \0 terminata con zero binario
    ...

    mentre argv e' un puntatore che punta al primo elemento (ad argv[0]) ...

    Cosa non capisci in particolare ..?
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Utente di HTML.it
    Registrato dal
    Nov 2003
    Messaggi
    726
    Beh diciamo che è la prima volta che vedo una cosa del genere.
    Mi risulta tutto complesso innanzitutto perchè ho ancora dei dubbi sui puntatori e sopratutto perchè io ho sempre lavorato con stringhe di dimensione prefissata usando un array, quindi la locazione che si usava era prefissata e di una certa dimensione.

    Qua invece la dimensione è definita dal numero di caratteri che io immetto e questa è una cosa che io non avevo davvero mai visto.

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,466
    Originariamente inviato da Downloader
    Mi risulta tutto complesso innanzitutto perchè ho ancora dei dubbi sui puntatori
    Ecco ... ritorna a studiare bene i puntatori prima di andare avanti ...

    e sopratutto perchè io ho sempre lavorato con stringhe di dimensione prefissata usando un array, quindi la locazione che si usava era prefissata e di una certa dimensione.
    Cioe'?

    Qua invece la dimensione è definita dal numero di caratteri che io immetto e questa è una cosa che io non avevo davvero mai visto.
    Questa non l'ho capita ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  5. #5
    Utente di HTML.it
    Registrato dal
    Nov 2003
    Messaggi
    726
    Ecco ... ritorna a studiare bene i puntatori prima di andare avanti ...
    Il problema è che sul mio libro di testo non c'è molto.
    Non avresti un gran bel libro di C da consigliarmi?

    sopratutto perchè io ho sempre lavorato con stringhe di dimensione prefissata usando un array, quindi la locazione che si usava era prefissata e di una certa dimensione.
    char str[100]; // stringa di 100 caratteri


    Qua invece la dimensione è definita dal numero di caratteri che io immetto e questa è una cosa che io non avevo davvero mai visto.
    Se faccio *str[10]; avrò un array di puntatori a 10 stringhe la cui dimensione però non è fissata da nessuna parte, no?
    Quindi se io faccio:
    str[0] = "abc"
    e
    str[1] = "123456"
    i primi due puntatori puntano a due stringhe di differente grandezza.
    Quello che non avevo mai visto è che io posso utilizzare memoria senza che sia effettivamente allocata e questo non mi sconfiffera poi tanto a dire il vero.
    Forse ho saltato un passaggio?

  6. #6
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,466
    Originariamente inviato da Downloader
    Il problema è che sul mio libro di testo non c'è molto.
    Non avresti un gran bel libro di C da consigliarmi?
    No ... non ne ho ... ne ho letti tanti e tutti vanno bene, piu' o meno ...

    Ma bada bene ... NON esiste il libro che ti chiarira' TUTTI i dubbi che hai ...
    Ci vuole tempo ... e tanto studio ...

    char str[100]; // stringa di 100 caratteri
    99 caratteri piu' il terminatore ... non lo dimenticare mai ...

    Se faccio *str[10]; avrò un array di puntatori a 10 stringhe la cui dimensione però non è fissata da nessuna parte, no?
    Avrai 10 puntatori a stringa NON INIZIALIZZATI ...

    Quindi se io faccio:
    str[0] = "abc"
    e
    str[1] = "123456"
    i primi due puntatori puntano a due stringhe di differente grandezza.
    Sì, ma puntano a due stringhe che NON potrai modificare.
    Infatti, se scrivi in quel modo, il compilatore alloca lo spazio per la stringa "abc" e per la stringa "123456" all'interno del file .exe e rende quest'area non modificabile (perche' quelle stringhe sono ritenute COSTANTI). Il puntatore di quest'area viene assegnata al puntatore che vuoi usare (str[0] oppure str[1]) ... quindi la stringa esiste e corrisponde ad un zona di memoria ...

    Quello che non avevo mai visto è che io posso utilizzare memoria senza che sia effettivamente allocata e questo non mi sconfiffera poi tanto a dire il vero.
    Forse ho saltato un passaggio?
    Diversa e' la questione della creazione di una stringa con caratteri che sono inseriti in input o derivati da un'elaborazione. Allora DEVI allocare la memoria dinamicamente e assegnare il puntatore ottenuto dalla malloc, al puntatore che vuoi usare (tra i 10 che hai ...).

    Puoi anche allocare STATICAMENTE lo spazio per un vettore di stringhe ... devi tenere solamenet presente che una stringa e' gia' un vettore di char e quindi un vettore di stringhe sara' una ... matrice di char. Ad esempio cosi'

    codice:
    char str[100][10];
    
    strcpy(str[0], "la stringa che vuoi");
    
    printf("%s\n", str[0]);
    dichiari che vuoi usare 10 stringhe da massimo 99 (+ terminatore) caratteri ...

    Lo spazio sara' allocato interamente e potrai usare la singola stringa per un numero di caratteri che vuoi FINO al massimo di 99 ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

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.