|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Member
Iscritto dal: Jan 2007
Messaggi: 173
|
[C] Concatenazione stringhe statica e dinamica
Ciao a tutti, devo fare questo esercizio
Codice:
Scrivere function C che, confrontando il risultato ottenuto mediante strcat(...), restituisce la concetenazione di due stringhe senza usare strcat (...) mediante: 1 Allocazione statica 2 Allocazione dinamica e le funzioni memcpy(...) e memmove(...) P.s. Ci sono 2 main perchè ho iniziato facendo gli esercizi separatamente poi in seguito vorrei unire il tutto. Codice:
/* #include <stdio.h> #include <string.h> #define N 30 void strcat_allocazione_statica (char a[], char b[], char c[],int *prova); main() { char a[N],b[N],c[N]; int d,prova; short i,nn; puts("Scrive 1 parola"); gets(a); puts("Scrivine un'altra"); gets(b); strcat_allocazione_statica(a,b,c,&prova); nn=strlen(c); puts("\n\nStringa senza strcat"); for (i=0;i<nn;i++) printf("%c",c[i]); puts("\n\nLa concatenazione e' ok se il risultato e' 1, altrimenti no"); printf("%d\n",prova); system("pause"); } void strcat_allocazione_statica (char a[], char b[], char c[], int *prova) { short i,n1,n2; n1=strlen(a); n2=strlen(b); for (i=0;i<n1;i++) c[i]=a[i]; for (i=0;i<n2;i++) c[n1+i]=b[i]; strcat(a,b); puts("Stringa con strcat"); for (i=0;i<n1+n2;i++) printf("%c",a[i]); for (i=0;i<n1+n2;i++) if (a[i]==c[i]) *prova=1; else *prova=0; } */ #include <stdio.h> #include <string.h> #include <stdlib.h> void strcat_allocazione_dinamica(char *a, char *b,char *c); main() { char *a, *b, *c; puts("Digita 1 stringa"); gets(a); puts("Digita un'altra stringa"); gets(b); strcat_allocazione_dinamica(a,b,c); puts("Risultato"); printf("%s",c); free(c); system("pause"); } void strcat_allocazione_dinamica(char *a,char *b,char *c) { short n1,n2,n3; n1=strlen(a); n2=strlen(b); n3=n1+n2; c=(char *)malloc(n3); memcpy(c,a,n1); memmove(c+n1,b,n2); } ![]() |
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: Feb 2002
Città: Modena
Messaggi: 590
|
Se non ricordo male il C dovresti fare coì per la malloc:
Codice:
c=(char *)malloc(n3*sizeof(char)); Ciauz |
![]() |
![]() |
![]() |
#3 |
Senior Member
Iscritto dal: Jul 2002
Città: Milano
Messaggi: 19148
|
è giusto fare la malloc mettendo anche il sizeof dell'elemento
in questo caso sizeof(char) è 1 quindi va bene mettere solo n3, ma è buona abitudine tenere il sizeof, non si sa mai ![]() il problema qual è esattamente? c'è un segmentation fault da qualche parte? |
![]() |
![]() |
![]() |
#4 |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Come fai a ritornare il vettore c allocato al chiamante ?
Se fai così dovrebbe funzionare: char * strcat_allocazione_dinamica(char *a,char *b) In alternativa puoi fare: void strcat_allocazione_dinamica(char *a,char *b,char **c) Attenzione al carattere di fine stringa, n3 deve essere n1 + n2 + 1. |
![]() |
![]() |
![]() |
#5 |
Member
Iscritto dal: Jan 2007
Messaggi: 173
|
Grazie 1000 per le risposte, ho aggiunto quello che avete suggerito
Codice:
main() { char *a, *b, *c; puts("Digita 1 stringa"); gets(a); puts("Digita un'altra stringa"); gets(b); strcat_allocazione_dinamica(a,b,&c); puts("Risultato"); printf("%s",c); free(c); system("pause"); } void strcat_allocazione_dinamica(char *a,char *b,char **c) { short n1,n2,n3; n1=strlen(a); n2=strlen(b); n3=n1+n2+1; *c=(char *)malloc(n3*sizeof(char)); memcpy(*c,a,n1); memmove(*c+n1,b,n2); } @cionci Ho messo il +1 e i puntatori, cmq c'è ancora qualcosa che non va. @vegeta83ssj Ricordi bene ma come ha detto recoil si puo' farne a meno, cmq l'ho messo @recoil Cos'è un segmentation fault? LOL Cmq mi crasha quando inserisco la 2a parola |
![]() |
![]() |
![]() |
#6 |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Devi aggiungere il carattere di fine stringa in fondo alla stringa c...oppure lo copi dalla seconda stringa:
memmove(*c+n1,b,n2+1); ps: strcat non fa esattamente quello che fai te: http://www.cplusplus.com/reference/c...ng/strcat.html |
![]() |
![]() |
![]() |
#7 |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Non mi torna anche questa cosa che hai fatto:
char *a, *b, *c; puts("Digita 1 stringa"); gets(a); puts("Digita un'altra stringa"); gets(b); In questo modo non allochi lo spazio per le stringhe a e b... Ultima modifica di cionci : 16-05-2007 alle 15:03. |
![]() |
![]() |
![]() |
#8 | |
Member
Iscritto dal: Jan 2007
Messaggi: 173
|
Quote:
![]() per il fatto della strcat ho visto che mette anche uno spazio tra le parole, intendi questo come errore? Ultima modifica di k_mishima : 17-05-2007 alle 17:00. |
|
![]() |
![]() |
![]() |
#9 |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
No...strcat non mette lo spazio fra le parole. E' diverso anche il numero di argomenti fra le tue strcat e la strcat del C
![]() Purtroppo ti trovi di fronte ad uno dei grandi problemi del C, la possibilità di buffer overflow con la libreria standard...per questo per la lettura di stringhe si usa sempre fgets al posto di gets...infatti in questo modo si può limitare il numero di caratteri letti... char s[20]; /* 19 caratteri + fine stringa */ fgets(s, 19, stdin); Quindi o fai come ho fatto sopra...oppure non ti preoccupi della dimensione del buffer in ingresso ed usi gets allocando le due stringhe in ingresso a dimensioni massime che decidi tu... Ovviamente se l'utente inserisce più dei caratteri che hai previsto in una sola parola il programma potrebbe andare incontro a blocchi improvvisi o malfunzionamenti... |
![]() |
![]() |
![]() |
#10 | |
Senior Member
Iscritto dal: Jul 2002
Città: Milano
Messaggi: 19148
|
Quote:
le security flaws relative al buffer overflow sono note da secoli e si scrive ancora codice insicuro eppure, per evitare buona parte dei problemi, basterebbe un minimo di attenzione hai fatto bene a sottolineare sta cosa stesso discorso per le funzioni tipo strlen ecc. ci sono le funzioni con la dimensione massima della stringa, usiamole ![]() |
|
![]() |
![]() |
![]() |
#11 |
Member
Iscritto dal: Jan 2007
Messaggi: 173
|
ok, ma io queste cose ancora non le ho fatte, per ora mi devo limitare a fare questi esercizi a livello piu' basso, senza preoccuparmi delle possibili cause di malfunzionamento dovuti a casi particolari tipo il buffer overlflow di cui parlate.
Per ora sono ancora bloccato al codice del mio messaggio precedente, non ho capito come allocare a e b. Come faccio? Grazie |
![]() |
![]() |
![]() |
#12 |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Metti una dimensione onesta sperando che l'utente non immetta troppi caratteri
![]() Le allochi in modo statico o dinamico, è indifferente... |
![]() |
![]() |
![]() |
#13 |
Member
Iscritto dal: Jan 2007
Messaggi: 173
|
Non ci siamo capiti mi sa.
Non lo so fare, potresti buttare giu' 2 righe di codice tu? Li vorrei allocare dinamicamente ma non lo so fare, mi serve una mano da voi. Staticamente uso array di caratteri char c[qualcosa]; E dinamicamente? |
![]() |
![]() |
![]() |
#14 |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Con malloc...l'hai scritto anche sopra...
a = (char *)malloc(qualcosa*sizeof(char)); |
![]() |
![]() |
![]() |
#15 |
Member
Iscritto dal: Jan 2007
Messaggi: 173
|
Ahhhhhhhhhhhhhhhhhhhhhh
Ora vedendolo scritto mi è chiaro. Cioè io quel "qualcosa" posso darlo anche grandissimo perchè tanto essendo dinamica la cosa verrà cancellato e non si sprecherà spazio giusto? Mi ero perso questo passaggio, invece del "qualcosa" nella formula ci volevo mettere la lunghezza di a e b, ma non sapevo come fare dato che per leggerle dovevo prima aver allocato lo spazio ![]() Provo e dopo posto i risultati, grazie cionci Edit: Codice:
#include <stdio.h> #include <string.h> #include <stdlib.h> void strcat_allocazione_dinamica(char *a,char *b,char **c); main() { char *a, *b, **c; a=(char *)malloc(20*sizeof(char)); puts("Digita 1 stringa"); gets(a); b=(char *)malloc(20*sizeof(char)); puts("Digita un'altra stringa"); gets(b); strcat_allocazione_dinamica(a,b,c); puts("Risultato"); printf("%s",*c); printf("\n"); free(c); system("pause"); } void strcat_allocazione_dinamica(char *a,char *b,char **c) { short n1,n2,n3; n1=strlen(a); n2=strlen(b); n3=n1+n2+1; *c=(char *)malloc(n3*sizeof(char)); memcpy(*c,a,n1); memmove(*c+n1,b,n2); } »«¼½ Ultima modifica di k_mishima : 17-05-2007 alle 19:14. Motivo: Aggiunta codice |
![]() |
![]() |
![]() |
#16 |
Member
Iscritto dal: Jan 2007
Messaggi: 173
|
help me
|
![]() |
![]() |
![]() |
#17 | |
Senior Member
Iscritto dal: Oct 2005
Messaggi: 3306
|
Quote:
Codice:
memset(a,0,20); |
|
![]() |
![]() |
![]() |
#18 |
Member
Iscritto dal: Jan 2007
Messaggi: 173
|
e non posso inserire il carattere di fine stringa sfruttando gli indirizzi?
ho provato ma non ci sono riuscito, con l'array sarebbe stato piu' facile come dovrei fare? |
![]() |
![]() |
![]() |
#19 |
Member
Iscritto dal: Jan 2007
Messaggi: 173
|
up
|
![]() |
![]() |
![]() |
#20 |
Member
Iscritto dal: Jan 2007
Messaggi: 173
|
dai, manca un'anticchia per finirlo
|
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 21:06.