Serginho153 (Normal User)
Newbie
Messaggi: 4
Iscritto: 03/03/2013
|
Codice sorgente - presumibilmente C++ |
#include<stdio.h> #include<stdlib.h> #define N 10 char * jstrcat(char *s1, char *s2); int main() { char s1[N+1], s2[N+1], *s; scanf("%s", s1); scanf("%s", s2); s=jstrcat(s1, s2); printf("%s", s); return 0; } char * jstrcat(char *s1, char *s2) { char s[2*(N+1)]; *s2=*s1+N; *s=*s1; return s; }
|
Salve ragazzi sono nuovo. Non ho ancora afferrato benissimamente come usare i puntatori...So che *p vuol dire il valore puntato da p, quindi sarebbe &a, cioè l'indirizzo della variabile a...Tuttavia non sono ancora così ferrato. Sapete dirmi perchè mi da quest'errore? warning: function returns address of local variable
Ho dimenticato di dire che l'esercizio vuole che date due stringhe, stampi a video la loro concatenazione. Grazie
Ultima modifica effettuata da Serginho153 il 03/03/2013 alle 17:05 |
|
()
Newbie
Messaggi:
Iscritto:
|
perchè stando alla dichiarazione dovresti ritornare un puntatore, e invece ritorni un array
|
|
Serginho153 (Normal User)
Newbie
Messaggi: 4
Iscritto: 03/03/2013
|
Postato originariamente da TheDarkJuster:
perchè stando alla dichiarazione dovresti ritornare un puntatore, e invece ritorni un array |
Quindi? Cosa dovrei cambiare? |
|
Poggi Marco (Member)
Guru
Messaggi: 969
Iscritto: 05/01/2010
|
Ciao!
Per risolvere il problema ci sono molteplici soluzioni:
_Dichiarare i vettori nel main, e effettuare le operazioni in jstrcat
_Allocare dinamicamente memoria in jstrcat, ed effettuare le operazioni di concatenamento.
Nel concatenamento delle stringhe, controlla il terminatore.
|
|
()
Newbie
Messaggi:
Iscritto:
|
Codice sorgente - presumibilmente C++ |
char * jstrcat(char *s1, char *s2) { char *s = (char*)malloc(sizeof(char)*(2*(N+1))); *s2=*s1+N; *s=*s1; return s; }
|
Ti ricordo inoltre che dichiarare array che variano la dimensione a runtime è una delle più brutte idee che ti possano venire, in questo caso è bastato correggere con un malloc, fa le stesse cose, la dimensione è variabile, tratti la variabile come un array e non hai più il problema che avevi prima nel tipo di ritorno.
|
|
Serginho153 (Normal User)
Newbie
Messaggi: 4
Iscritto: 03/03/2013
|
Postato originariamente da TheDarkJuster:
Ti ricordo inoltre che dichiarare array che variano la dimensione a runtime è una delle più brutte idee che ti possano venire, in questo caso è bastato correggere con un malloc, fa le stesse cose, la dimensione è variabile, tratti la variabile come un array e non hai più il problema che avevi prima nel tipo di ritorno. |
Ma N è una costante, come fa a variare?
Non mi va anche se incollo il tuo codice...
Postato originariamente da Poggi Marco:
Ciao!
_Dichiarare i vettori nel main, e effettuare le operazioni in jstrcat
|
Scusate la mia ignoranza ma quali vettori dovrei dichiarare nel main? Ho già dichiarato s, s1, s2
Postato originariamente da Poggi Marco:
Ciao!
_Allocare dinamicamente memoria in jstrcat, ed effettuare le operazioni di concatenamento.
Nel concatenamento delle stringhe, controlla il terminatore.
|
Dici come mi ha consigliato ThedarkJuster? ho copiato il suo codice, dopo averlo eseguito mi da lo stesso output. Cioè mi da il primo carattere della prima stringa e basta.
Come controllo il terminatore? E soprattutto ti riferisci a '\0'? |
|
()
Newbie
Messaggi:
Iscritto:
|
Scusa tanto, ero di fretta e non avevo controllato se N era costante, comunque il senso è quello, se vuoi ritornare un char* la variabile deve essere char* non char[], ti pare? E sì, il carattere terminatore è lo 0x00 altrimenti chiamato '\0'. Comunque tu hai fatto un pasticcio enorme! Usa questo:
Codice sorgente - presumibilmente C++ |
#include<stdio.h> #include<stdlib.h> #include <iostream> #include <string.h> #include <malloc.h> #define N 10 char * jstrcat(char*, char*, int, int); int main() { char s1[N+1], s2[N+1], *s; gets(s1); gets(s2); s=jstrcat(s1, s2, strlen(s1), strlen(s2)); printf("%s", s); return 0; } char * jstrcat(char *s1, char *s2, int s1length,int s2length) { char *s = (char*)malloc(s1length+s2length); int i; for (i = 0; i < s1length; i++) s[i] = s1[i]; int currentPositionOnS = i; for (i = 0; i < s2length; i++) { s[currentPositionOnS] = s2[i]; currentPositionOnS++; } s[currentPositionOnS] = '\0'; return s; }
|
e tieni conto che non sei in pascal quindi non puoi fare s1 = s2 se s1 ed s2 sono array!!!
Ultima modifica effettuata da il 03/03/2013 alle 18:32 |
|
pierotofy (Admin)
Guru^2
Messaggi: 6230
Iscritto: 04/12/2003
|
Il warning ti viene dato perche' quando allochi dinamicamente un array usando:
Codice sorgente - presumibilmente C/C++ |
Lo spazio viene allocato sullo stack (il quale verra' deallocato al momento del return). Usando malloc() utilizzi lo spazio sull'heap, quindi dovrai ricordarti di deallocare lo spazio manualmente con free().
Ultima modifica effettuata da pierotofy il 03/03/2013 alle 18:41
|
|
tasx (Dev Team)
Expert
Messaggi: 439
Iscritto: 15/12/2008
|
Postato originariamente da TheDarkJuster:
perchè stando alla dichiarazione dovresti ritornare un puntatore, e invece ritorni un array |
ehm puntatore e array sono la stessa cosa in c...
------------
quello che il compilatore ti dice é: occhio perché la funzione che hai scritto ritorna un puntatore ad una variabile che verrá deallocata una volta usciti dalla funzione stessa quindi il suo valore perde senso e potrebbe portare ad un comportamento anomalo del programma(seg fault, memory leak, etc....)... |
|