Originariamente inviata da
MItaly
Al di là del fatto che il codice non è indentato (
), c'è più o meno un errore per riga...
codice:
scanf("%d",&risp);
Qui non stai controllando il valore restituito da scanf, che ti dice se è riuscita ad acquisire l'intero o meno.
Non è portabile; per quanto riguarda lo standard, è undefined behavior, e gcc infatti lo ignora completamente.
codice:
s=malloc((sizeof(stringaa)*risp)+1);
sizeof non restituisce la lunghezza "logica" della stringa, ma semplicemente le sue dimensioni. Dato che stringaa è un puntatore a char, restituirà sempre e comunque la stessa dimensione (4 su una macchina a 32 bit, 8 su una a 64 bit), e non le dimensioni del buffer passato alla funzione, che, se ti servono, devono essere passate separatamente. In ogni caso, non è chiaro perché tu voglia allocare risp per le dimensioni di stringaa, visto che comunque non sai quanto sarà lunga la stringa acquisita.
gets è deprecata, dato che acquisisce tranquillamente stringhe di lunghezza qualunque, indipendentemente dalla lunghezza del buffer. Già qui rischi un buffer overflow.
codice:
strcat(s,stringaa);
Stai concatenando stringhe di lunghezza sconosciuta ad un buffer di dimensioni limitate, è la ricetta per un buffer overflow.
Inoltre, ogni volta che usi strcat questa si deve ripercorrere tutta la stringa per capire dove finisce e quindi effettuare la copia. Dato che concateni tante volte,
le performance di questo sistema sono pessime.
codice:
printf("%s\n",concatena(stringa));
concatena ti restituisce una stringa allocata con malloc, ma la passi direttamente alla printf, senza salvare da qualche parte il puntatore, che va così perduto, e quindi non la puoi deallocare con free. È vero che qui il programma termina subito, ma in ogni caso hai un memory leak.
Non è portabile; usa una getchar() piuttosto.
Per poterti suggerire un approccio alternativo, dovresti dire quali dovrebbero essere le specifiche di questa funzione, ovvero, di base cosa deve fare? A cosa dovrebbe servire il buffer passato? Intendi gestire la concatenazione di stringhe di lunghezza arbitraria?
Per inciso, ho tagliato un attimo il titolo, che dovrebbe essere giusto una descrizione sintetica del problema.