Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Marvel's Wolverine, la recensione: Logan torna protagonista in un'avventura brutale e intensa
Marvel's Wolverine, la recensione: Logan torna protagonista in un'avventura brutale e intensa
Marvel's Wolverine porta Logan in un'avventura inedita, violenta e fortemente narrativa, costruita attorno alla sua natura di combattente e al difficile rapporto con il proprio passato. Insomniac Games punta su combattimenti spettacolari, progressione e personalizzazione, inserendo l'azione in un mondo segnato dalla persecuzione dei mutanti. Un viaggio intenso, che alterna mattanza, esplorazione e momenti sorprendentemente emotivi.
DJI Romo 2: tante novità lo rendono un robot completo
DJI Romo 2: tante novità lo rendono un robot completo
Romo 2 è la seconda generazione di robot lavapavimenti di DJI, un modello che si caratterizza per la precisione nel sistema di navigazione e per il funzionamento particolarmente silenzioso. Con le modifiche introdotte in questa seconda versione, e un posizionamento di prezzo più allineato alla concorrenza, rappresenta una valida alternativa sul mercato delle soluzioni di pulizia domestica
Sony Bravia 9 II: il True RGB alla prova, dove l'LCD sfida l'OLED
Sony Bravia 9 II: il True RGB alla prova, dove l'LCD sfida l'OLED
Il primo Sony con retroilluminazione True RGB alla prova del banco di misura e dei contenuti: luminanza enorme, colori accurati in HDR e un antiriflesso molto efficace. I limiti sono due sole HDMI 2.1 e il blooming fuori asse
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 15-05-2007, 21:01   #1
k_mishima
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(...)
La parte statica l'ho fatta, quella dinamica non funziona ed è incompleta.
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);
}
Devo aver fatto un bel pasticcio nella function dinamica mi sa, cmq è la prima volta che provo con la modalita' dinamica
k_mishima è offline   Rispondi citando il messaggio o parte di esso
Old 15-05-2007, 21:54   #2
vegeta83ssj
Senior Member
 
L'Avatar di vegeta83ssj
 
Iscritto dal: Feb 2002
Città: Modena
Messaggi: 594
Se non ricordo male il C dovresti fare coì per la malloc:

Codice:
c=(char *)malloc(n3*sizeof(char));
da prendere con le molle però perchè è un pò che non bazzico il C.

Ciauz
vegeta83ssj è offline   Rispondi citando il messaggio o parte di esso
Old 15-05-2007, 22:02   #3
recoil
Senior Member
 
L'Avatar di recoil
 
Iscritto dal: Jul 2002
Città: Milano
Messaggi: 19150
è 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?
recoil è offline   Rispondi citando il messaggio o parte di esso
Old 15-05-2007, 23:06   #4
cionci
Senior Member
 
L'Avatar di cionci
 
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.
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 16-05-2007, 14:27   #5
k_mishima
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
k_mishima è offline   Rispondi citando il messaggio o parte di esso
Old 16-05-2007, 14:38   #6
cionci
Senior Member
 
L'Avatar di cionci
 
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
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 16-05-2007, 15:01   #7
cionci
Senior Member
 
L'Avatar di cionci
 
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.
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 16-05-2007, 17:13   #8
k_mishima
Member
 
Iscritto dal: Jan 2007
Messaggi: 173
Quote:
Originariamente inviato da cionci Guarda i messaggi
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...
mmmm, e come dovrei fare ad allocarlo? Con malloc no perchè non posso fare la strlen se non ho preso ancora "a" e "b"

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.
k_mishima è offline   Rispondi citando il messaggio o parte di esso
Old 16-05-2007, 17:43   #9
cionci
Senior Member
 
L'Avatar di cionci
 
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 E' quello che ti volevo far notare...

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...
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 16-05-2007, 22:09   #10
recoil
Senior Member
 
L'Avatar di recoil
 
Iscritto dal: Jul 2002
Città: Milano
Messaggi: 19150
Quote:
Originariamente inviato da cionci Guarda i messaggi
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 E' quello che ti volevo far notare...

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...
queste cose non si ripetono mai abbastanza
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
recoil è offline   Rispondi citando il messaggio o parte di esso
Old 17-05-2007, 16:59   #11
k_mishima
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
k_mishima è offline   Rispondi citando il messaggio o parte di esso
Old 17-05-2007, 17:27   #12
cionci
Senior Member
 
L'Avatar di cionci
 
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...
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 17-05-2007, 18:05   #13
k_mishima
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?
k_mishima è offline   Rispondi citando il messaggio o parte di esso
Old 17-05-2007, 18:11   #14
cionci
Senior Member
 
L'Avatar di cionci
 
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));
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 17-05-2007, 18:54   #15
k_mishima
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);
}
Ancora non viene, non sempre, ma a volte nella stampa mi ritrovo di seguito alla soluzione molti caratteri ascii strani tipo
»«¼½

Ultima modifica di k_mishima : 17-05-2007 alle 19:14. Motivo: Aggiunta codice
k_mishima è offline   Rispondi citando il messaggio o parte di esso
Old 18-05-2007, 14:28   #16
k_mishima
Member
 
Iscritto dal: Jan 2007
Messaggi: 173
help me
k_mishima è offline   Rispondi citando il messaggio o parte di esso
Old 18-05-2007, 17:00   #17
tomminno
Senior Member
 
Iscritto dal: Oct 2005
Messaggi: 3306
Quote:
Originariamente inviato da k_mishima Guarda i messaggi
Ancora non viene, non sempre, ma a volte nella stampa mi ritrovo di seguito alla soluzione molti caratteri ascii strani tipo
»«¼½
Dopo aver fatto la malloc prova ad usare:
Codice:
memset(a,0,20);
dopo aver eseuito la malloc. Una stringa in C finisce con il carattere '\0', ma quando allochi non conosci il contenuto della memoria perciò la stampa prosegue anche oltre il dovuto.
tomminno è offline   Rispondi citando il messaggio o parte di esso
Old 19-05-2007, 20:38   #18
k_mishima
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?
k_mishima è offline   Rispondi citando il messaggio o parte di esso
Old 21-05-2007, 14:33   #19
k_mishima
Member
 
Iscritto dal: Jan 2007
Messaggi: 173
up
k_mishima è offline   Rispondi citando il messaggio o parte di esso
Old 22-05-2007, 13:31   #20
k_mishima
Member
 
Iscritto dal: Jan 2007
Messaggi: 173
dai, manca un'anticchia per finirlo
k_mishima è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Marvel's Wolverine, la recensione: Logan torna protagonista in un'avventura brutale e intensa Marvel's Wolverine, la recensione: Logan torna p...
DJI Romo 2: tante novità lo rendono un robot completo DJI Romo 2: tante novità lo rendono un ro...
Sony Bravia 9 II: il True RGB alla prova, dove l'LCD sfida l'OLED Sony Bravia 9 II: il True RGB alla prova, dove l...
Geely EX5, un mese al volante: il SUV elettrico cinese che ci ha sorpreso (quasi) senza riserve Geely EX5, un mese al volante: il SUV elettrico ...
Mova Z70 Ultra Roller Complete: motore potente, rullo di lavaggio e l'IA a guidare Mova Z70 Ultra Roller Complete: motore potente, ...
La prima missione orbitale del razzo spa...
Servizi in streaming sempre più c...
Anteprima della Leapmotor B03X: inizia l...
Anthropic accusa la Cina: Claude utilizz...
I satelliti Rassvet (Starlink russo) di ...
Un agente IA ha risolto un problema su W...
Cina: la CMSA potrebbe cambiare parte de...
68 mensilità di bonus per i dipen...
Rocket Lab ha fatto ricorso contro la de...
Nutanix rende disponibile Azure Virtual ...
Il padrino del deep learning avverte: gl...
Il finto avviso "iPhone Storage is Full"...
Dietrofront in Cina, addio touchscreen p...
Un piccolo accessorio trasforma lo smart...
Dopo 370 anni il Cyphral Distich non è p...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 19:42.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v