oops.. è vero...
non avevo notato un particolare.
Dichiarandeo s e t in questo modo
codice:
char *s = "buona!";
char *t = "notte";
è come se dicessi al compilatore:
<<Alloca in memoria la stringa "buona!" e poi fa puntare s all'inizio di questo spazio di memoria.>>
<<Alloca in memoria la stringa "notte" e poi fa puntare t all'inizio di questo spazio di memoria.>>
Il risultato è che le stringhe "buona!" e "notte" sono gestite come se fossero in memoria di sola lettura, cosicché non puoi sovrascrivere niente. Se invece le avessi dichiarate s[] e t[] allora sovrascriverle sarebbe stato perfettamente lecito. Ma per contro non avresti potuto modificare il valore di s e t, non potendole usare quindi come puntatori.
Comunque questo comportamento dipende da compilatore a compilatore (il mio Borland non mi dà problemi).
Ti consiglio di cercare da qualche parte se ne vuoi sapere di più (ma il succo è questo).
ps: implementalo in una funzione quel ciclo, così da una parte puoi modificare a piacimento i puntatori, dall'altra non ci sono problemi nella modifica delle stringhe e nel ritorno all'inizio delle stesse.
codice:
#include<stdio.h>
void copia_stringa(char * d, const char* s) {
while(*d++ = *s++);
}
int main() {
char s[] = "buona!";
char t[] = "notte";
clrscr();
printf("La stringa1 e': %s\n", s);
printf("La stringa2 e': %s\n", t);
copia_stringa(s, t);
printf("la stringa concatenata è: %s", s);
getch();
}
pps: andrea, non serve fare come hai scritto tu, in parte questo thread ne è la risposta :metallica