Newsgroup: it.comp.lang.c
Titolo: Domanda

Salve ragazzi!
Sono un neofita del #C, volevo chiedervi perchè questo programma non 
funziona.. o meglio funziona ma stampa solo l'ultima stringa inserita 3 
volte mentre(in teoria) dovrebbe stampare le 3 stringhe che si sono 
immesse..
#include <stdio.h>
char *semi[3]; //array di stringhe
int main(){
	char Buffer[256];
	int i;
	for(i=0;i<3;i++){
		scanf("%s",Buffer);
		semi[i]=Buffer;
		printf("%s\n",semi[i]);
	}
	for(i=0;i<3;i++){
		printf("%s\n",semi[i]);
	}
}
p.s Come risolvere il problema??

 		semi[i]=Buffer;
Infatti in questo modo stai assegnando alle tre componenti di semi 
sempre lo stesso valore (del puntatore alla prima componente dell' array 
Buffer),  ovvero lo stesso indirizzo di memoria.
Quello di cui hai bisogno sono tre aree di memoria in cui copiare tre 
contenuti successivi dell' array Buffer. Nel tuo programma di queste 
aree di memoria non c' e' traccia  e la copia tra Buffer e queste aree 
di memoria va fatta carattere per carattere (magari usando una delle 
function di libreria preposte alla manipolazione di stringhe... prova a 
guardare sul tuo manuale di C).
Giorgio

 ha scritto nel messaggio
news:e7t8dp$nuh$1...@news.cineca.it...


> p.s Come risolvere il problema??
Ciao,
devi semplicemente allocare le stringhe, in quel modo fai riferimento
sempre allo stesso indirizzo.
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
        char *semi[3]; //array di stringhe
        char Buffer[256];
        int i;
        size_t auxlen = 0;
        for(i=0;i<3;i++)
        {
                fgets(Buffer, 255,stdin);
                auxlen = strlen(Buffer) + 1;
                semi[i]=alloca(auxlen);
                strncpy(semi[i], Buffer, auxlen);
        }
        semi[i] = 0x0;
        for(i=0;semi[i];i++)
                printf("%s",semi[i]);
return 0;
}


Ma no, suvvia. Non puoi fare una cosa del genere. Semi è stato dichiarato 
come array di puntatori a char. Se fai una strcpy così come hai suggerito, 
copi il contenuto dell'array che si trova all'indirizzo Buffer (indirizzo 
allocato e valido) all'indirizzo contenuto nel puntatore semi[0, 1, 2] cioè 
in un posto a caso nella memoria perché i 3 puntatori 'semi' non sono stati 
inizializzati. Allora o dichiari semi come array di array di caratteri
char semi[3][256];
oppure allochi memoria dinamicamente con una delle funzioni della famiglia 
malloc e ne assegni gli indirizzi ai 3 puntatori 'semi'. Dopodiché è 
possibile utilizzare la strcpy.
Delz si trova in stampa per 3 volte l'ultima stringa inserita perché con il 
ciclo che fa inizialmente
for(i=0;i<3;i++)
{
    scanf("%s", Buffer);
    semi[i]=Buffer;
}
legge un parola e la carica in Buffer poi assegna l'indirizzo di Buffer a 
semi[0]; al ciclo successivo legge una nuova parola e sovrascrive la 
precedente su Buffer ed a semi[1] assegna sempre lo stesso indirizzo di 
Buffer. Così ancora per il terzo ciclo: sovrascrive il contenuto di Buffer e 
ne assegna l'indirizzo a semi[2].
Il risultato è che in Buffer si trova l'ultima parola letta con scanf e che
semi[0] == semi[1] == semi[2] == Buffer
cioè tutto punta all'indirizzo di Buffer. Di conseguenza con il ciclo
for(i=0;i<3;i++)
    printf("%s\n",semi[i]);
stampa per 3 volte il contenuto di Buffer e cioè l'ultima parola letta con 
la scanf.
Un saluto.
Maxime 

strcpy(...) non alloca memoria? a me sembra che ne allochi tanto quanto
basta per contenere i caratteri puntati dal suo secondo argomento...
Ciao.
"Maxime" <dmaN...@libNSero.it> ha scritto nel messaggio
news:qztog.19036$zy5.3...@twister1.libero.it...


 basta per contenere i caratteri puntati dal suo secondo argomento...
No, nella maniera più assoluta ;)
Ciao
Dark_Knight
-- 
The Lord Of The (Token) Ring
  (the fellowship of the packet)
"One Ring to link them all, One Ring to ping them,
one Ring to bring them all and in the darkness sniff them."

 Ciao.
Secondo me ti confondi con la strdup(), la strcpy() copia solo.
ciao
Giacomo