Newsgroup: it.comp.lang.c
Titolo: domanda su strcpy e strcat

Ho questo piccolo programmino:
/****** Inizio codice *******/
#include <stdio.h>
#include <string.h>
int main (char** argv, int argc)
{
    char s1[10];
    char s2[10];
 
    puts ("Dammi s1");
    gets (s1);
 
    puts ("Dammi s2");
    gets (s2);
 
    printf ("s1 e': %s, s2 e' %s\n", s1, s2);
 
    printf ("s1 ha lunghezza %d s2 ha lunghezza %d\n", strlen(s1),
strlen(s2) );
    printf ("s2 copy su s1: %s\n", strcpy (s1,s2) );
    printf ("s1 concat su s2: %s\n", strcat (s1,s2) );
 
    getch();
 
    return 0;
}
/****** Fine codice *******/
Guardate questo output
Dammi s1
ci
Dammi s2
ao
s1 e': ci, s2 e' ao
s1 ha lunghezza 2 s2 ha lunghezza 2
s2 copy su s1: ao
s1 concat su s2: aoao
---
Vi chiedo s1 concatenata su s2 non doveva essere ciao???
Grazie
 
 

>    printf ("s2 copy su s1: %s\n", strcpy (s1,s2) );
non ho testato, ma strcpy copia s2 in s1, dopo questa operazione s1 è più la 
stringa "ci"
ReDiCuori
-- 
-- 
L'uomo non sa perchè si innamora, l'uomo viene travolto e basta
---------------------------------------------------------
www.giordanoemilio.altervista.org
---------------------------------------------------------
www.securitygroup.it
Società di servizio che opera nel campo
della sicurezza aziendale
---------------------------------------------------------
www.pascallike.too.it
http://utenti.lycos.it/pascallike
il sito sulla programmazione pascal
sorgenti, tutorial ed utility
------------------------------------------------------------
www.treves-srl.com
Libreria Internazionale Treves
Via Toledo 249/250 Napoli
------------------------------------------------------------
www.alphalibri.com
Vendita ingrosso di libri
Via S.Anna dei Lombardi 10 , Napoli
------------------------------------------------------- 

[frank] ha scritto:

Con strcpy() la copia e' definitiva quindi la linea
printf ("s2 copy su s1: %s\n", strcpy (s1,s2) )
fa diventare s1 uguale a s2, e dopo stampa s1 col suo nuovo contenuto.
-- 
Devaraja (Xdevaraja87^gmail^c0mX)
Linux Registerd User #338167
http://counter.li.org

 printf ("s1 concat su s2: %s\n", strcat (s1,s2) );
strcpy e strcat non instanziano un nuovo array, ma modificano il contenuto
dell'array passato come primo argomento e ne restituiscono l'indirizzo. (E'
buona norma leggere la documentazione prima di usare una funzione.)
In generale, non ha poi molto senso usare il valore di ritorno di strcpy.
E se vuoi un consiglio, non usare mai 'strcat'. Dimenticatela.
Max

 E se vuoi un consiglio, non usare mai 'strcat'. Dimenticatela.
Io non sarei cosi' categorico. La strcat() e' una funzione utilissima
che va usata "cum grano salis" come tutte le funzioni che scrivono su
array e blocchi di memoria allocati dinamicamente. L'uso di strncat()
e' sicuramente piu' indicato per cercare di evitare sfondamenti di
memoria, ma sicuramente non serve ad escluderli.
Alla fine dell'uso che si fa delle funzione e' sempre ne e' sempre
responsabile il programmatore.
C:\>iao Angelo
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG

 array e blocchi di memoria allocati dinamicamente. 
Secondo me, strcat è proprio una funzione inutile. Spiego.
Se non sai con certezza di aver spazio a sufficienza per concatenare l'altra
stringa, strcat è intrinsicamente pericolosa. Quindi non la usi.
Se invece lo sai con certezza, vuol dire che *già* conosci la lunghezza
della stringa. In questo caso
     strcpy( s1 + s1_length, s2 );
è, per ovvie ragioni, più efficiente di
      strcat( s1, s2 );
Max

      strcpy( s1 + s1_length, s2 );
Concordo.  Nel caso della concatenazione, spesso è utile snprintf().

int main (char** argv, int argc)
Qui non dovrestri usare int main (int argc, char** argv ) ?

 Secondo me, strcat è proprio una funzione inutile. Spiego.
Solo per questa affermazione, ti farei riscrivere quel migliaio di
cicli in cui ho evitato la prima strcpy() semplicemente mettendo
'\0' il primo carattere del blocco di memoria che dovevo riempire.
:-)
Sicuramente la strcat() e' rimpiazzabile con altre funzioni,
che sia inutile e' molto opinabile... 
