Visualizzazione dei risultati da 1 a 9 su 9
  1. #1

    Inizializzazione char

    Mi spiegate il perchè un inizializzazione di questo tipo non è corretta:

    codice:
    	c = "cane";

    Ad esempio inizializzando cosi

    codice:
    char c[10]={"cane"};
    o tramite una scanf tutto è ok?


    codice:
    #include <stdio.h>
    typedef struct{
    	int prezzo;
    	char *nome;	
    }libro;
    
    int main(void)
    {
    	libro uno;
    
    	uno.prezzo = 120;
    	uno.nome="lupo";
    	
    	printf("Il libro %s costa %d\n", uno.nome, uno.prezzo);
    	return 0;
    }
    Se dichiaro nome un puntatore ok, ma se dichiaro char e vado ad inizializzare nel corpo non va..
    Ve ne sarei grado se mi risolvete questi dubbi.
    Grazie!

  2. #2
    Utente di HTML.it L'avatar di KrOW
    Registrato dal
    Feb 2009
    Messaggi
    281
    Ciao ... Una variabile char è una variabile destinata a contenere un carattere. Nel tuo esempio "cane" non è un carattere ma una stringa (che in C sarebbe un' array di caratteri terminati dal carattere '\0') quindi non puoi assegnare una stringa ad un carattere. Invece, nell' istruzione char c[10] = {"cane"} stai dicendo al compilatore di allocare spazio per un array di 10 caratteri ed inizializzare tale array con la stringa "cane" ... Cioè il primo carattere dell' array sarà il carattere 'c', il secondo 'a', il terzo 'n', il quarto 'e', il quinto '\0' che sarebbe il carattere terminatore della stringa ... Comunque il discorso è più complesso (soprattutto riguardo l' utilizzo dei puntatori come stringhe) e certamente non è compito di un forum quello di spiegare queste cose (che tra l' altro sono di base) ma sarebbe compito di un buon manuale ...
    C++ 4ever
    496e2062696e6172696f206e6f6e2063692061767265737469 206e656d6d656e6f2020726f7661746f203a29

  3. #3
    Originariamente inviato da KrOW
    Ciao ... Una variabile char è una variabile destinata a contenere un carattere. Nel tuo esempio "cane" non è un carattere ma una stringa (che in C sarebbe un' array di caratteri terminati dal carattere '\0') quindi non puoi assegnare una stringa ad un carattere. Invece, nell' istruzione char c[10] = {"cane"} stai dicendo al compilatore di allocare spazio per un array di 10 caratteri ed inizializzare tale array con la stringa "cane" ... Cioè il primo carattere dell' array sarà il carattere 'c', il secondo 'a', il terzo 'n', il quarto 'e', il quinto '\0' che sarebbe il carattere terminatore della stringa ... Comunque il discorso è più complesso (soprattutto riguardo l' utilizzo dei puntatori come stringhe) e certamente non è compito di un forum quello di spiegare queste cose (che tra l' altro sono di base) ma sarebbe compito di un buon manuale ...
    rileggi la domanda, mi sa che non l'hai capita!! VVoVe:
    non ho mai parlato di un inizializzazione con un char ma quel "c" è sempre un array..
    quello che non mi spiegavo è perchè queste due inziailizzazioni

    codice:
    	
    char c[10];
    c = "cane";
    
    e
    
    char c[10]={"cane"};
    non hanno lo stesso effetto..

    PS se un forum non è adatto alla risoluzione in "comunità" di un problema dell'utente..a cosa serve?
    Una delle definizione di forum è appunto..
    Def: Area virtuale basata su un argomento specifico sul quale è possibile scambiare opinione.

  4. #4
    Utente di HTML.it L'avatar di KrOW
    Registrato dal
    Feb 2009
    Messaggi
    281
    Scusa avevo capito un' altra cosa ... Dopo la definizione dell' array, c sarà visto dal compilatore come un puntatore const quindi un istruzione tipo:
    codice:
    c = "cane";
    equivale ad un assegnazione dell' indirizzo della stringa "cane" (memorizzata in un' area di sola lettura) ad un puntatore const (c) e quindi equivale ad un' errore (proprio perchè il puntatore non può puntare ad un'altra locazione di memoria) ...
    C++ 4ever
    496e2062696e6172696f206e6f6e2063692061767265737469 206e656d6d656e6f2020726f7661746f203a29

  5. #5
    a ok, quindi per inzializzare un array con una stringa quale sarebbe la procedura giusta?
    assegnare un carattere ad ogni posizione?

    c = 'c';
    c[1] = 'a';
    c[2] = 'n';
    c[3] = 'e';
    c[4] = '\0';

  6. #6
    Puoi usare la strcpy:
    codice:
    strcpy(c, "cane");
    .
    Amaro C++, il gusto pieno dell'undefined behavior.

  7. #7
    Originariamente inviato da MItaly
    Puoi usare la strcpy:
    codice:
    strcpy(c, "cane");
    .
    si, ma volevo capire come fare senza l'uso di funzioni..

  8. #8
    Puoi fare come hai detto prima (assegnando un carattere alla volta), ma non è molto comodo...
    Amaro C++, il gusto pieno dell'undefined behavior.

  9. #9
    Originariamente inviato da MItaly
    Puoi fare come hai detto prima (assegnando un carattere alla volta), ma non è molto comodo...
    a ok.. 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 © 2024 vBulletin Solutions, Inc. All rights reserved.