Codice: Seleziona tutto
p = (char *)malloc((N+N+1)*sizeof(char));
Moderatore: Staff
Codice: Seleziona tutto
p = (char *)malloc((N+N+1)*sizeof(char));
Codice: Seleziona tutto
p = (char *)malloc(N+N+1 /*dato che hai trovato la soluzione lo aggiungo*/)*sizeof(char));
Codice: Seleziona tutto
p = malloc(N+N+1 /*dato che hai trovato la soluzione lo aggiungo*/);
Blizzard ha scritto: infatti straquoto la prima soluzione che hai postato che è senza dubbio infinitamente elegante
Esatto! E' buona regola inizializzare TUTTO! Stroustrup docet.Blizzard ha scritto: E volendo, le puoi far ritornare un puntare al suo argomento di stringa concatenata (szSum): a volte risulta comodo: per esempio, la strcpy fa proprio cosi'.
cavolo! non l'avevo visto@boh: il buon funzionamente della tua soluzione e' random. Suggerimento: pensa alla prima strcat()
No, lo spazio per il terminatore c'e' (anzi, ce n'e' uno in piu'), perche' le stringhe in input sono lunghe, al max, N caratteri, terminatore compreso, dato che sono dichiarate con qualcosa tipo:boh ha scritto:E manca l'eventuale spazio per il terminatore
Codice: Seleziona tutto
p = (char *)malloc((N+N+1)*sizeof(char));
Codice: Seleziona tutto
char str[N]
Codice: Seleziona tutto
char str[N+1]
Codice: Seleziona tutto
char *boh(char *a, char *b)
{
static char out[4096];
strcpy(out, a);
strcat(out, b);
return(out);
}
figurati anche un mio professore... poi con in pompa magna il Kerningan&Ritchie me ne sono convinto anche io!@Blizzard: guarda il casting della malloc è pignoleria della mia prof, quindi figurati
Per caso deve essere:robbybby ha scritto:@boh
InC'e' un errore.Codice: Seleziona tutto
p = (char *)malloc((N+N)*sizeof(char)); strcat(p, str1); strcat(p, str2);
A te trovarlo.
Il free lo devi fare sempre. Questa e' una delle ragioni per cui, in un programma vero, una funzioni siffatta non sarebbe molto bella.
- KISS ruleBlizzard ha scritto:ora che mi ero convinto anch'io che era meglio che ci arrivasse da solo
perchè adotti questa soluzione???Codice: Seleziona tutto
char *boh(char *a, char *b) { static char out[4096]; strcpy(out, a); strcat(out, b); return(out); }
gia lo static di per se non lo amo... ma poi la soluzione non è adattiva ma devi restare sempre nel range di caratteri 4095+1
inoltre con la static se non sbaglio se richiami la funzione vai a sovrascrivere il dato che hai precedentemente restituito e questo è codice pericoloso..
dico fandonie?????
Non sempre: c'e' chi fa andare ancora aggeggi con il DOS (freedos, oggi), e 640 k di memoria. Vedi il sottoscritto. E li' mi serve anche il byte.Mario Vanoni ha scritto: > con il 3B2 dei tempi, OK, ogni byte contava, allora 512KB, oggi ho 4GB di memoria
Noksniffer ha scritto:Per caso deve essere:
p = (char *)malloc((N+N+1)*sizeof(char));
strcat(p, str1);
strcat(p, str2);
Sì?
Ah ora ho capito!Mario Vanoni ha scritto: > out[0] = '\0';
@boh
aggiungi la riga sopra citata, scusa ul vecc
Bravo! Giusto, ma con una piccola inesattezzaboh ha scritto: Ah ora ho capito!
La strcat sostituisce il terminatore con il primo carattere della stringa da concatenare, ma essendo che
non c'è ancora alcun terminatore all'interno di p, funziona appunto a random
La strcpy d'altro canto copia anche il terminatore, quindi è rigoroso prima una strcpy e poi una strcat, è questo giusto?
(grazie ancora a Mario!)