|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Jan 2007
Città: villa verucchio
Messaggi: 1921
|
[c] grossi dubbi con le stringhe
ho un po di problemi con le stringhe in c:
1. perchè se scrivo char prova[5]={"ciao"}; funziona ma se scrivo: char prova[5]; prova="ciao"; oppure prova={"ciao"}; non va??? in piu ho notato che scrivendo char *prova[5]; prova="ciao"; funziona, ma per quale motivo? 2. ho una struct del tipo: struct prova{ char stringa[5]}; struct prova struttura; struttura.stringa="ciao"; e non funziona quest'ultima riga, come faccio? vi sarei davvero grato di una mano! In sostanza come posso modificare una stringa dopo l'inizializzazione?
__________________
CPU: Amd Phenom II 955--MB: Gigabyte GA-890GPA-UD3H--RAM:4 GB DDR3--SV: ATI Radeon HD 5770--HD: Western Digital Caviar Black 500 gb--ALI:: Corsair 650w--MONITOR: SyncMaster P2270--ROUTER: Netgear DG834G--SO: Win 7 Professional 64 bit |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Jan 2007
Messaggi: 1237
|
Non funziona perchè prova (nel punto 1) e stringa (nel punto 2) sono puntatori al primo elemento dei rispettivi array, che sono array di char.
Quindi tu invece assegni una stringa ad un char. |
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
1. "Ciao" è un cosiddetto literal constant. Di fatto è un stringa che è allocata in memoria al momento della creazione del programma. Ha quindi una sua allocazione ed una sua posizione in memoria.
char *p = "Ciao"; assegna al puntatore p l'indirizzo del literal constant. {"Ciao"} o "Ciao" si possono usare per inizializzare le stringhe...ma SOLO in fase di inizializzazione. Infatti se io scrivo: char x[5]; x = "ciao"; è un errore perché x ha un puntatore predefinito durante l'inizializzazione e NON MODIFICABILE. Quindi è impossibile modifcare x assegnandogli il puntatore a literal constant. 2. Per modificare il valore di una stringa si usa la funzione di libreria strcpy. |
|
|
|
|
|
#4 | |
|
Senior Member
Iscritto dal: Jan 2007
Città: villa verucchio
Messaggi: 1921
|
Quote:
char*prova; *prova="ciao"; funziona perchè vado ad agire sul contenuro dell'indirizzo puntato giusto? quindi senza le function della libreria string è praticamente impossibile lavorare bene con le stringhe no?
__________________
CPU: Amd Phenom II 955--MB: Gigabyte GA-890GPA-UD3H--RAM:4 GB DDR3--SV: ATI Radeon HD 5770--HD: Western Digital Caviar Black 500 gb--ALI:: Corsair 650w--MONITOR: SyncMaster P2270--ROUTER: Netgear DG834G--SO: Win 7 Professional 64 bit |
|
|
|
|
|
|
#5 |
|
Senior Member
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
|
No, puoi lavorarci lo stesso, ma in pratica ciò significa andare a implementarsi le stesse funzionalità che quella libreria espone.
__________________
As long as you are basically literate in programming, you should be able to express any logical relationship you understand. If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it. (Chris Crawford) |
|
|
|
|
|
#6 | |
|
Senior Member
Iscritto dal: Jan 2007
Messaggi: 1237
|
Quote:
Codice:
char*prova; prova="ciao"; |
|
|
|
|
|
|
#7 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
E' legale, ma attenzione...è rischioso perché questo provoca un errore:
char *prova; prova = "ciao"; prova[1] = 'b'; <------è errato perché si va a modificare un literal constant Non so in C, ma in C++ prova = "ciao" genera uno warning: /home/cionci/provacpp/prova.cpp|163|warning: deprecated conversion from string constant to ‘char*’| Al contrario questo non lo genera su prova = "ciao", ma viene segnalato un errore sulla riga succesiva: const char *prova; prova = "ciao"; prova[1] = 'b'; <------errore |
|
|
|
|
|
#8 |
|
Senior Member
Iscritto dal: Jan 2007
Città: villa verucchio
Messaggi: 1921
|
ok ora è tutto un poco più chiaro! sono alle prese col c da qualche mese, prima avevo studiato java e pascal, trovo che una delle "pecche" maggiori del c sia la mancanza di una variabile di tipo string, che renderebbe la risoluzione di molti problemi piu semplici, non trovate anche voi?
__________________
CPU: Amd Phenom II 955--MB: Gigabyte GA-890GPA-UD3H--RAM:4 GB DDR3--SV: ATI Radeon HD 5770--HD: Western Digital Caviar Black 500 gb--ALI:: Corsair 650w--MONITOR: SyncMaster P2270--ROUTER: Netgear DG834G--SO: Win 7 Professional 64 bit |
|
|
|
|
|
#9 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Concordo...
|
|
|
|
|
|
#10 | |
|
Bannato
Iscritto dal: Mar 2008
Città: Villabate(PA)
Messaggi: 2515
|
Quote:
![]() x Cionci :
|
|
|
|
|
|
|
#11 | |
|
Senior Member
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
|
Quote:
__________________
As long as you are basically literate in programming, you should be able to express any logical relationship you understand. If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it. (Chris Crawford) |
|
|
|
|
|
|
#12 |
|
Bannato
Iscritto dal: Mar 2008
Città: Villabate(PA)
Messaggi: 2515
|
|
|
|
|
|
|
#13 |
|
Senior Member
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
|
Allora buon week end
, lol
__________________
As long as you are basically literate in programming, you should be able to express any logical relationship you understand. If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it. (Chris Crawford) |
|
|
|
|
|
#14 | ||||
|
Senior Member
Iscritto dal: Nov 2008
Messaggi: 530
|
Quote:
analizziamo da destra a sinistra : -"ciao" questo non fa altro che creare una stringa costante (const char *) -char prova[5] questo crea un vettore di 5 elementi di tipo char; come è gestito un vettore : un vettore è gestito come un puntatore costante al primo elemento, infatti utilizzando il suo nome (nel tuo caso - prova) non fai altro che utilizzare l'indirizzo della prima locazione di memoria puntata da tale variabile. come si gestiscono i puntatori costanti, devono essere subito inizzializzati all'atto della dichiarazione, quindi bisogna definirli subito. ecco perchè nel primo caso funziona. poi nel secondo caso, come detto, essendo un puntatore costante, non puo essere riassegnato. Quote:
per farlo funzionare dovresti fare : *prova = "ciao"; Quote:
Quote:
Codice:
//sd = stringa destinazione
//so = stringa origina
char *CopiaStringa(char *sd, const char *so)
{
char *temp = sd;
while(*sd++ = *so++) ;
return sd;
}
|
||||
|
|
|
|
|
#15 |
|
Senior Member
Iscritto dal: Nov 2008
Messaggi: 530
|
|
|
|
|
|
|
#16 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
|
|
|
|
|
|
#17 |
|
Senior Member
Iscritto dal: Nov 2008
Messaggi: 530
|
|
|
|
|
|
|
#18 | |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Quote:
L'assegnazione di un literal constant provoca uno warning che l'assegnamento è deprecato. Il fatto che sia deprecata non significa che sia illegale, è legale, ma deprecata. |
|
|
|
|
|
|
#19 | |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Quote:
Se invece si va a fare una modifica tramite il puntatore il codice provocherà un segmentation fault a runtime. Ultima modifica di cionci : 22-11-2008 alle 16:59. |
|
|
|
|
|
|
#20 |
|
Senior Member
Iscritto dal: Nov 2008
Messaggi: 530
|
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 21:29.














, lol








