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

Salve a tutti, studiando su un libro di C mi sono imbattuto in un esercizio
che non riesco a risolvere, e il libro non riporta la soluzione per capire
come procedere.
#Testo:
Scrivere una funzione che legga due stringhe. Utilizzare la funzione
malloc() per allocare la memoria sufficiente a contenere le 2 stringhe dopo
averle concatenate.Restituire un puntatore a questa nuova stringa. Ad
esempio se vengono passate alla funzione le stringhe "Ciao" e "mondo" la
funzione deve restituire un puntatore a "ciao mondo".
#Fine testo
Ora..questo devo risolverlo senza l'uso delle funzioni per le stringhe
contenute in string.h (niente strlcat,strlen etc..).
Nei programmi di studio sono arrivato a studiare fino ad array e puntatori.
Potete scrivermi come risolverlo in modo da capire il modo corretto di
procedere, visto che è una parte importante..? Ringrazio anticipatamente

"Andreas" <mari...@XXfreemail.it> ha scritto nel messaggio
news:JGdK7.130682$sq5.6...@news.infostrada.it...

La funzione deve contenere prima un ciclo per calcolare la lunghezza delle
stringhe (xes: l1 e l2), tenendo presente che le stringhe terminano sempre
con un '\0'; poi allochi con malloc lo spazio necessario a contenere la
stringa finale, cioè l1+l2+1 (considerando anche il '\0' di fine stringa) ed
infine con un paio di cicli for copi carattere per carattere le due stringhe
su quella allocata. Non è molto complesso, ma se hai problemi riposta.
Ciao,
Cecco

Non è molto complesso, ma se hai problemi riposta.
Detto fatto....grazie e scusa x il disturbo...

 temporanea per contenere la nuova stringa...
Esatto e devi restituirla all'uscita.
Qualcosa del tipo:
char *myconcat(const char *s1, const char *s2)
{
     char *result = malloc(strlen(s1)+strlen(s2)+1);
     ....
     ....
     return result;
}
-- 
Posted from  [80.105.34.80] 
via Mailgate.ORG Server - 
http://www.Mailgate.ORG

 prima.......questo è un altro problema...
Ad esempio:
//str3 allocata come ho detto prima, l1 e l2 lunghezze delle stringhe str1 e
str2
for ( i = 0; i < l1; i++ )
        str3[i] = str1[i];
for ( j = 0, k = i++; j < l2; j++, k++ )
        str3[k] = str2[j];
str3[k++] = '\0';
Ciao,
Cecco

 a contenere le 2 stringhe dopo averle concatenate.
mettiamo che le due stringhe siano in stringa1 e stringa2:
i = 0
while (stringa1[i] != '\0')
 i++;
stessa cosa con la seconda stringa, poi sommi i valori delle due
variabili che hai usato e hai la dimensione delle stringhe. a questo
punto:
char * nuovastringa;
... (qui metti i due cicli per contare la lunghezza di ciascuna
stringa che memorizzi ad esempio in lung dopo averla incrementata di
1)
nuovastringa = malloc(lung * sizeof(char));
for (k=0;k<i;k++)
 nuovastringa[k] = stringa1[k]
(stessa cosa per la seconda stringa però l'indice k per nuovastringa
non deve partire da 0...)
return nuovastringa;

Ragazzi grazie davvero per l'aiuto...comunque sono riuscito a completarla
prima di leggere i Vs. consigli, meglio... il listato è il seguente..
Potreste darmi qualche correzione sulla possibile risoluzione con magari
meno spreco di risorse...grazie ancora!
--------------------------snip----------------------------
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int     i , l1 , l2 , l3;
char *fusione(char *, char *);
int main()
{
 l1=l2=1;
 char prima[10], seconda[10];
 char *terza;
 puts("Inserisci la prima stringa seguita dalla seconda: ");
 scanf("%s %s",prima,seconda);
 l1=strlen(prima);    /*consentito solo strlen x stringhe*/
 l2=strlen(seconda);
 prima[l1]='  ';       /*avrei potuto usare gets() che avrebbe messe
terminatore ma */
 seconda[l2]='\0'; /*nella prima stringa non ne ho bisogno... */
 l3=l1+l2+1;
 terza=fusione(prima,seconda);
 puts(terza);
 return 0;
}
char *fusione(char *prima, char *seconda)
{
 int ctr=0;
 char *fusa;
 fusa =(char *)malloc((l3+2) * sizeof(char));
 if(fusa==NULL)
 {
  puts("Errore nell'allocazione della memoria");
  exit(1);
 }
  for(i = 0; i <= (l1) ; i++)
  fusa[i]=prima[i];
 for(i = ( l1+1 ) , ctr = 0;i <= (l3+1) && ctr <= l2 ; i++ , ctr++)
  fusa[i]=seconda[ctr];
 fusa[l3+2]='\0';
 return(fusa);
 }
---------------------------snip------------------------------
Che ne dite? Grazie.

Che ne dite? Grazie.
Ora che ti sei esercitato, ti riscrivo il codice, in un modo
che a me sembra corretto.  Confrontalo con il tuo:
<CODE>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
/* concat()
   concatena due stringhe e restituisce la stringa risultato
   s1 + s2.
   Si suppone che per la stringa destinazione lo spazio
   allocato sia sufficiente.
*/
char *concat(char *dest, const char *s1, const char *s2)
{
    int i, j = 0;
    for (i = 0; s1[i]; i++) {
        dest[j++] = s1[i];
    }
    for (i = 0; s2[i]; i++) {
        dest[j++] = s2[i];
    }
    dest[j] = '\0';
    return dest;
}
int main()
{
    char *s1 = "The", *s2 = "Follet";
    char *dest;
    dest = malloc(strlen(s1) + strlen(s2) + 1);
    printf("%s + %s = %s\n\n", s1, s2,
                             concat(dest, s1, s2));
    free(dest);
    puts("Premi INVIO per uscire...");
    getchar();
    return 0;
}
</CODE>
-- 
The Follet

scanf("%s",&stringa)
Non proprio, o meglio, meglio non farlo.
Se stringa e' un puntatore e' sbagliato usare l'operatore
address-of (&), se e' un vettore di caratteri non e'
necessario ed e' logicamente errato.
La scrittura corretta e': scanf("%s", stringa);
Ma per evitare problemi, si usi fgets().
-- 
The Follet