Newsgroup: it.comp.lang.c
Titolo: copia stringhe

ciao a tutti! Cosa c'e' che non va in questo semplice programmino:
----------------
#include <stdio.h>
int main(void)
{
      char *s = "ciao", *t;
      while (*t++ = *s++)
            ;
      printf("\n%s\n%s\n\n", s, t);
      return 0;
}
----------------
Il gcc mi dice:
prova.c: In funcion `main':
prova.c:7: warning: suggest parentheses around assignment used as truth
value
Quel while e' copiato paro paro da quello a pag. 134 del K&R.
--------------------------------
Inviato via 
http://arianna.libero.it/usenet/

 Quel while e' copiato paro paro da quello a pag. 134 del K&R.
il while non ti da un errore ma un  giustissimo warning.
Infatti di solito in un while o un if si testa
una uguaglianza (segno ==) e non si fa un assegnamento.
Quindi se il compilatore trova un assegnamento ti
suggerisce di controllare se e' quello che volevi fare
o se ti sei dimenticato un =.
Se poi metti l'assegnamento tra parentesi smette di lamentarsi.
L'errore grave del tuo programma e' invece
che stai copiando la stringa s nella stringa t,
ma per t non hai allocato memoria.
Quindi stai di fatto scrivendo in una zona a caso della
tua memoria, con tutti i pericoli che questo comporta.
Per allocare memoria per la stringa t puoi usare
o un approccio "dinamico" con malloc()
oppure uno statico, come ad esempio
char t[100];
ciao,
g.

 
A parte che quello che stai facendo è pericoloso in quanto t non è 
allocato, nell'istruzione:
       while (*t++ = *s++)
hai messo il segno di comparazione e non di assegnazione.

This message was cancelled from within Mozilla.

Grazie mille, sei stato chiaro oltremodo!
Co sti puntatori non ci vado molto d'accordo


> Co sti puntatori non ci vado molto d'accordo
Ecco appunto ho problemi!
------------------
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(void)
{
        char *s = "ciao", *t;
        t = malloc(sizeof(int) * (strlen(s) + 1));
        while (*t++ = *s++)
                /* niente */;
        printf("\n%s\n%s\n\n", s, t);
        return 0;
}
------------------
L'output non me l'aspettavo proprio e non riesco a capire perche' esce
questa cosa qua:
------------------
%s
%s
------------------
Che vo di'? Dove sbaglio?


 Che vo di'? Dove sbaglio?
Con problemi cosi' semplici dovresti eseguire il programma
passo-passo con carta e penna e allora ti accorgeresti degli
errori...
comunque 2 errori saltano immediatamente agli occhi:
1) la malloc e' sbagliata, perche' allochi piu' memoria di
quella necessaria. I caratteri occupano 1 byte, non sizeof(int)...
quindi o sostituisci sizeof(int) con sizeof(char) o piu'
banalmente scrivi malloc(strlen(s)+1);
(comunque questo errore non pregiudica il funzionamento).
2) errore grave: siccome nel ciclo while fai avanzare i puntatori
s e t, di fatto perdi traccia di dove cominciano le stringhe s e t...
quindi stampi caratteri privi di senso.
invece del while potresti usare una banale strcpy(t,s);
che copia appunto s in t;
oppure usi indice:, tipo:
int i;
for (i=0; s[i]; i++) t[i]=s[i];
t[i]=0;
oppure usi due puntatori ausiliari,
char *ss, *tt;
tt=t;
ss=s;
e poi fai il while usando tt e ss, ma stampi
usando s e t che continuano a puntare all'inizio
delle stringhe,
etc.etc.etc.
ciao,
g.

 
non ho provato, ma quando fai s++, significa che il puntantore s,
si sposta fisicamente nella posizione successiva...
vale a dire... alla fine ti troverai:
1 passaggio s= "ciao"
2 passaggio s= "iao"
3 passaggio s= "ao"
...
ultimo s= ""
l'incrementazione lasciala fare ad un puntatore che non ti serve...
ptr_s= s;
while( .. ptr_s++...)
in questo caso s restera sempre sulla stringa "ciao"
ps: come diceva il compagno, t non è allocata...
bye duido