Visualizzazione dei risultati da 1 a 6 su 6
  1. #1
    Utente di HTML.it
    Registrato dal
    May 2009
    Messaggi
    55

    [C] Stringhe e Allocazione

    Salve ragazzi...So che non è bellissimo come primo messaggio chiedervi un favore...Però questo che vi chiedo è più una semplice verifica...

    Ora vi spiego...Avendo ancora le idee un pò confuse su quella che può essere la differenza tra un array di caratteri e una stringa (che la stringa finisce con il terminatore e l'array di char lo so...non sono arrivato a questo punto )...c'era un esercizio che ho provato a fare...Funziona...Ma non so se magari ho sbagliato ad usare la stringa..


    Ora vi spiego...l'esercizio consiste nel creare due stringhe, una allocata dinamicamente e una allocata staticamente, in cui vanno inseriti passo dopo passo i singoli caratti immessi in Input, senza usare le funzioni standard come lo strcat..

    Ora io ho scritto questo:

    #include <stdio.h>


    void main()
    {
    int i, size;
    char carat;
    char stringa_statica[20];
    char *stringa_dinamica;



    printf("Quanti caratteri vuoi inserire?(MAX20): ");
    scanf("%d", &size);
    printf("\n\n");

    stringa_dinamica = (char *) malloc(size+1);

    for(i=0; i<size; i++)
    {
    fflush(stdin);
    printf("%d^ Carattere: ", i+1);
    scanf("%c", &carat);
    printf("\n");


    stringa_statica[ i ]=carat;
    stringa_dinamica[ i ]=carat; <--- La domanda riguarderà questa riga di codice


    printf("\n");
    }

    //Assegno i terminatori nel punto SIZE (essendo l'ultimo carattere in size-1)
    stringa_dinamica[size]='\0';
    stringa_statica[size]='\0';


    printf ("\nLa stringa STATICA e' <%s>",stringa_statica);
    printf ("\nLa stringa DINAMICA e' <%s>\n",stringa_dinamica);
    system("PAUSE");
    }
    Ora..come segnato in rosso, la domanda riguarda la stringa allocata dinamicamente (nel sorgente ho dimenticato di liberare la memoria allocata, poi rimedio)..Nonostante l'output sia perfetto e senza sbavature, mi chiedo...Posso usare in quel modo una stringa dichiarata con puntatore e allocata dinamicamente (cioè con le parentesi quadre per inserire i caratteri nei rispettivi indirizzi di memoria)?

    E poi..la prima stringa, chiamata stringa_statica , in realtà è un array di char e no una stringa per come è stata dichiarata o sbaglio?


    Si forse ho un pò le idee confuse tra array di char e stringhe

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462

    Re: [C] Stringhe e Allocazione

    Originariamente inviato da Malloc
    Posso usare in quel modo una stringa dichiarata con puntatore e allocata dinamicamente (cioè con le parentesi quadre per inserire i caratteri nei rispettivi indirizzi di memoria)?
    Sì ...

    E poi..la prima stringa, chiamata stringa_statica , in realtà è un array di char e no una stringa per come è stata dichiarata o sbaglio?
    In C gli array di caratteri terminati da 0 binario sono le strighe ...


    Si forse ho un pò le idee confuse tra array di char e stringhe
    Praticamente sono sinonimi, a patto di ricordare che la stringa ha un ultimo elemento dell'array usato come terminatore.

    Pero' il codice presenta un problema ... tu hai previsto 20 caratteri per la stringa_statica quando ne usi un numero che dipende da size ... attenzione, perche' non c'e' nessun controllo che size non superi i 20 caratteri previsti.

    E soprattutto, se prevedi 20 caratteri, in realta' sono 19 perche' l'ultimo e' il terminatore ... se vuoi usare 20 caratteri allora dovrai prevederne 21 ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Utente di HTML.it
    Registrato dal
    May 2009
    Messaggi
    55

    Re: Re: [C] Stringhe e Allocazione

    Quindi oltre al terminatore, tra array di char e stringhe non vi sono altre differenze?

    Esempio..l'essere dichiarate con o senza puntatore (e quindi senza o con allocazione statica)

    Originariamente inviato da oregon
    Pero' il codice presenta un problema ... tu hai previsto 20 caratteri per la stringa_statica quando ne usi un numero che dipende da size ... attenzione, perche' non c'e' nessun controllo che size non superi i 20 caratteri previsti.

    E soprattutto, se prevedi 20 caratteri, in realta' sono 19 perche' l'ultimo e' il terminatore ... se vuoi usare 20 caratteri allora dovrai prevederne 21 ...

    Vero hai ragione...Grazie di cuore per il chiarimento e la correzione

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462

    Re: Re: Re: [C] Stringhe e Allocazione

    Originariamente inviato da Malloc
    Quindi oltre al terminatore, tra array di char e stringhe non vi sono altre differenze?
    Una stringa C e' un array di char con terminatore ...

    Esempio..l'essere dichiarate con o senza puntatore (e quindi senza o con allocazione statica)
    Questo e' un fatto che riguarda solamente le modalità di allocazione della memoria per la stringa, non e' un qualcosa che "modifica" il concetto di stringa (puoi parlare di stringa allocata dinamicamente o meno ...).

    Ricorda comunque che il nome dell'array e', in ogni caso, un puntatore, il puntatore al primo elemento della stringa/array, comunque sia allocato.
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  5. #5

    Re: [C] Stringhe e Allocazione

    con:
    codice:
    $ gcc --version
    i686-apple-darwin8-gcc-4.0.1 (GCC) 4.0.1 (Apple Computer, Inc. build 5367)
    si ottengono gli autoesplicanti:
    codice:
    $ gcc -Wall -ansi -pedantic -Wextra -Wconversion main.c
    main.c:5: warning: return type of 'main' is not 'int'
    main.c: In function 'main':
    main.c:17: warning: implicit declaration of function 'malloc'
    main.c:17: warning: incompatible implicit declaration of built-in function 'malloc'
    main.c:17: warning: passing argument 1 of 'malloc' as unsigned due to prototype
    main.c:40: warning: implicit declaration of function 'system'
    quindi: modifica il codice in modo da eliminare i warning di cui sopra.

    Poi nel tuo codice, non controlli il valore restituito da malloc: comportamento indefinito nel caso la malloc fallisca.

    ;-)

  6. #6
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    1,326
    E aggiungerei di eliminare

    system("PAUSE") (va benissimo una più cristiana e portabile scanf("%*c") o getchar() );
    void main() (sostuire assolutamente con int main() e aggiungere ovviamente return 0 alla fine del codice);
    fflush(stdin) (che su alcuni sistemi non ha lo stesso effetto che ha su Windows, da sostituire ad esempio con while ( gechar() != '\n' ) );

    la portabilità dei programmi spesso non è da considerarsi un optional, e anche su programmini semplici sarebbe bene farci attenzione (d'altra parte, se ora avessi voluto provare a compilare questo codice su Linux avrei prima dovuto modificarlo. Si sarebbe trattato di poche righe da sostituire ovviamente, ma se ce ne fossero state di più?)
    every day above ground is a good one

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.