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

Buon giorno a tutti,
ho un problema nell'assegnare un carattere ad una variabile definita
come puntatore a carattere. Sicuramente è una bazzecola per chi
programma quotidianamente, ma io che non programmo da 10 anni non
riesco a capirne il motivo.
Per chiarire meglio ho esemplificato con questo programmino:
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
 	char *sStringa;
	int iIndice;
	iIndice = 0;
	if((sStringa = (char *) malloc(sizeof(char) * 100)) == NULL){
		printf("\n\nProblemi nell'allocazione della memoria!\n\n");
		return(1);
	}
	sStringa = "Esempio!";
	printf("sStringa = %s\n", sStringa);
	while(sStringa[iIndice]){
		printf("[%i] = [%c]\n",  iIndice, sStringa[iIndice]);
		iIndice++;
	}
	iIndice = 0;
	while(sStringa[iIndice]){
		sStringa[iIndice] = fgetc(stdin); // <----------------------------
Errore
		printf("[%i] = [%c]\n",  iIndice, sStringa[iIndice]);
		iIndice++;
	}
	return 0;
}
Il programmino non fa altro che allocare una zona contigua di memoria
di 100 caratteri assegnandola al puntatore sStringa, la inizializza con
la stringa di "Esempio!", ne visualizza il contenuto usando la forma ad
array di caratteri e in teoria dovrebbe reinizializzarlo con dei
caratteri che prende da tastiera. Ho anche provato ad usare
l'assegnazione diretta:
         sStringa[iIndice] = 'a'
ma l'errore permane.
Se io dichiaro la variabile sStringa come array di caratteri:
         char sStringa[100]
tutto funziona, ma non vorrei adottare questa strada.
Qualcuno sa spiegarmi il perchè di questo errore?
Grazie mille.

 	sStringa = "Esempio!";
Questa riga e' concettualmente sbagliata.
non esiste l'assegnamento di stringhe in C (esiste in C++).
Quello che stai facendo con l'ultima istruzione e' fare in modo che
il puntatore sStringa stia puntando ad una stringa che contiene
"Esempio!"  e che e' stata allocata staticamente al momento
della compilazione.
(Questo inoltre ti fa perdere ogni riferimento alla zona di memoria
allocata con la malloc sopra).
La cosa puo' anche funzionare se ti limiti a "leggere" la stringa,
ma se cerchi di modificarla spesso il sistema si incavola perche'
stai modificando una cosa che per lui fa parte del programma...
La cosa giusta da fare in quel caso e' usare le funzioni definite
appositamente in string.h, in questo caso la funzione di copia.
sStringa=malloc(100);
// il cast non serve e viene sconsigliato
strcpy(sStringa, "Esempio!");
Il resto del programma non l'ho guardato.
ciao,
g.

Grazie mille l'errore stava nell'inizializzazione della variabile
sStringa, inizializzata come costante.
Lo sapevo che mi perdevo in un bicchier d'acqua.

 }
Sull'allocazione ti ha gia` risposto Giovanni, io faccio un commento sul
secondo ciclo. Quel ciclo funziona perche` l'array sStringa e` stato
precedentemente inizializzato con una stringa; quindi incrementando
l'indice arriverai prima o poi al terminatore di stringa precedente;
il tuo codice ti permette di inserire solo una stringa che e` esattamente
lunga quanto quella di prova. Un approccio migliore sarebbe il seguente:
int i = 0;
int c;
while(i < (100 - 1)) {
        c = fgetc(stdin);
        if (c == '\n' || c == EOF)
                /* Invio oppure end-of-file */
                break;
        sString[i++] = c;
}
sStringa[i] = '\0';
In questo modo puoi leggere stringhe di lunghezza arbitraria (purche`
ci stiano nel buffer, altrimenti vengono troncate). Nota che i caratteri
effettivamente disponibili sono 99 (100 - 1), perche` riserviamo sempre
un posto per il terminatore di stringa.
Luca
-- 
Home: 
http://kronoz.cjb.net
E' stato a causa di una donna che ho cominciato a bere e non ho mai
avuto la cortesia di ringraziarla.

Ti ringrazio, anche se la seconda perte di programma mi serviva
solamente per far vedere che quando assegno un carattere a sStringa
ottenego un errore RUNTIME, cosa ovvia se punta ad una costante ma non
per me fino a quando Giovanni non me lo ha fatto notare.
Comunque ogni suggerimento è ben accetto, farò tesoro anche di questa
parte di codice.
Sono piacevolmente sorpreso dalla velocità di risposta che si ottiene
dai gruppi di discussione, francamente non pensavo.
Vi ringrazio ancora tutti.
G.