Newsgroup: it.comp.lang.c
Titolo: Array e stringhe

Ciao a tutti, premetto che sono un neofita quindi quanto sto per scrivere
potrebbe contenere errori madornali!!
Volevo sapere se è possibile assegnare ad una array di caratteri non
inizializzato una stringa costante.
Mi spiego:
Si può inizializzare l'array nel seguente modo:
char app[10]="ciao";
ma se non inizializzo , posso poi assegnargli una stringa costante?
Ad esempio:
char app[10];
app[ ]="ciao" /*errore!!!*/
O sono costretto ad assegnare uno ad uno gli elementi dell'array?
a[0]='c'
a[1]='i"
a[2]='a"
a[3]='0"
a[4]='\0"
Grazie a tutti!

 a[4]='\0"
La seconda che hai detto ;-)
La prima forma č una forma speciale, che in pratica copia in ogni cella
dell'array i caratteri della stringa passata ed aggiunge lo '\0'; ancora
migliore č:
char str[] = "qualunque cosa";
la dimensione viene desunta automaticamente dalla stringa.
Se non inizializzi l'array poi puoi solo copiarci sopra o a mano o con
strcpy i caratteri.
Ciao


Puoi usare anche funzioni tipo:
strcpy(a,"ciao");
sprintf(a,"%s %d\n","stampo un numero:",7)
o creartene una ad oc.
/* str deve essere una stringa valida, terminata con '\0' */
void init_str(char * arr,  char * str) {
    int i;
    for (i=0; arr[i]=str[i]; i++);
}
e poi
init_str(a,"ciao");
Ciao,
Ema

 ha scritto nel messaggio
news:be62nv$1jva2$1...@ID-190851.news.dfncis.de...


a[4]='\0"
O fai in questo modo (attento che le " diventano '), oppure usi
strcpy().
strcpy(app, "ciao");
-- 
Andrea Laforgia - a.laforgia(at)
libero.it
"There are three kinds of people in this world; 
 those who are good at maths and those who aren't".

Grazie a tutti per le risposte!
Se non vi spiace avrei un altra questione.
Scrivendo:
#include <stdio.h>
main()
{
char *stringa="ciao";
*stringa='C';
printf("%s", stringa);
  }
e compilandolo con Lcc il risultato è che viene stampatra la stringa "Ciao"
ovvero la "C" soistituisce la "c".
In pratica è stato possibile modificare una stringa costante.
In proposito il K&R dice che il risultato di operazioni del genere è
indefinito, e su uno dei tanti  tutorial "on line" è riportato che il
compilatore memorizza i "vettori statici di caratteri" nella memoria di sola
lettura.
E' quindi lasciato al compilatore decidere se è possibile modificare o meno
le sringhe costanti? In generale è comunque un errore? E cosa è la memoria
di sola lettura?
Grazie mille.
Franco

le sringhe costanti? In generale è comunque un errore?
Il K&R ha (ovviamente) ragione, nel senso che un'operazione di quel
tipo ha un comportamento indefinito ("undefined behavior" è il termine
usato dallo standard ISO del linguaggio).  Significa che la cosa
potrebbe funzionare o meno, a seconda della piattaforma su cui stai
compilando.  Per sicurezza, un'operazione del genere non andrebbe mai
fatta (anche perché si trova facilmente un'alternativa, nel caso
specifico).


 >*stringa='C';
si ma piu' che altro lui ha fatto un'altro errore ... ha usato un puntatore
a char non inizializzato per allocarci una stringa ... cioe' hai scritto in
un area di memoria che non ti apparteneva !!! gia' tanto che non ti e'
crashato tutto ...
ti consiglio di definire un puntatore char e poi allocare spazio per la tua
stringa e solo dopo utilizzare quello spazio, o seno alloca direttamente uno
spazio fisso definendo l'array di caratteri ma poi non devi sbordare.
ciao

 gia' tanto che non ti e' crashato tutto ...
Perchè sarebbe un errore?
Il vettore "ciao" in questo caso dovrebbe decadere in un puntatore al suo
primo elemento. Infatti la stringa di carateri "ciao" non è usata per
inizializzare  un VETTORE di caratteri, quindi non rientriamo nei "tre
casi"...
Ne dovrebbe seguire che "ciao" rappresenta un indirizzo e precisamente
l'indirizzo contenente il carattere 'c'. Qundi dovrebbe essere del tutto
lecito assegnare un INDIRIZZO ad un puntatore non inizializzato.
O non ci ho capito nulla?!
(la seconda che ho detto...eheheh!!)
Franco

Franco ha scritto:

La porzione di codice:
char *stringa="ciao";
è perfettamente legale, in quanto il puntatore viene inizializzato, non è
corretto invece cercare di modificare il contenuto della memoria puntata dal
puntatore per i motivi che correttamente citava Andrea qualche messaggio
sopra !
Salutoni a Tutti e Buona Domenica Dave.

 crashato tutto ...
Non è affatto vero; la notazione che ha usato Franco è corretta in quanto la
stringa "ciao" viene allocata in un'area di memoria a sola lettura, e il
puntatore stringa viene inizializzato facendolo puntare all'indirizzo del
primo elemento della stringa sopra allocata.
Ciao

 ha scritto nel messaggio
news:gTDNa.149011$Ny5.4...@twister2.libero.it...

ok ho sbagliato io ... disolito cerco sempre di allocare io tutto e tenerlo
sotto controllo ... cosi' da poter allocare e deallocare quando mi pare e
piace
vedendo una dichiarazione cosi mi sono un'attimo tirato fuori di testa
pensando a qualche cosa che creasse un puntatore non inizializzato e che poi
gli si cercava di mettere ciao/0 dentro quell'area di memoria ...
forse non era meglio dichiararlo const visto che cmq non puoi cambiare il
contenuto ??? cioe' non dico di stringa ma di dove punta ... dichiarando
anche il puntatore const cosi' da poi non rendere orfana un'area di memoria
se cambiassimo il puntatore???
spero di essermi fatto capire ...

 spero di essermi fatto capire ...
Infatti è più corretto:
const char *str = "qualcosa";
Ciao

crashato tutto ...
Assolutamente no.  Ciò che lui ha fatto è del tutto lecito, ha
definito e inizializzato allo stesso tempo il puntatore a caratteri.


primo elemento. 
Esatto.
