Torna indietro   Hardware Upgrade Forum > Software > Programmazione

HP Elitebook Ultra G1i 14 è il notebook compatto, potente e robusto
HP Elitebook Ultra G1i 14 è il notebook compatto, potente e robusto
Pensato per il professionista sempre in movimento, HP Elitebook Ultra G1i 14 abbina una piattaforma Intel Core Ultra 7 ad una costruzione robusta, riuscendo a mantenere un peso contenuto e una facile trasportabilità. Ottime prestazioni per gli ambiti di produttività personale con un'autonomia lontano dalla presa di corrente che permette di lavorare per tutta la giornata
Microsoft Surface Pro 12 è il 2 in 1 più compatto e silenzioso
Microsoft Surface Pro 12 è il 2 in 1 più compatto e silenzioso
Basato su piattaforma Qualcomm Snapdragon X Plus a 8 core, il nuovo Microsoft Surface Pro 12 è un notebook 2 in 1 molto compatto che punta sulla facilità di trasporto, sulla flessibilità d'uso nelle differenti configurazioni, sul funzionamento senza ventola e sull'ampia autonomia lontano dalla presa di corrente
Recensione REDMAGIC Astra Gaming Tablet: che spettacolo di tablet!
Recensione REDMAGIC Astra Gaming Tablet: che spettacolo di tablet!
Il REDMAGIC Astra Gaming Tablet rappresenta una rivoluzione nel gaming portatile, combinando un display OLED da 9,06 pollici a 165Hz con il potente Snapdragon 8 Elite e un innovativo sistema di raffreddamento Liquid Metal 2.0 in un form factor compatto da 370 grammi. Si posiziona come il tablet gaming più completo della categoria, offrendo un'esperienza di gioco senza compromessi in mobilità.
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: 590
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: 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?
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: 19148
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


HP Elitebook Ultra G1i 14 è il notebook compatto, potente e robusto HP Elitebook Ultra G1i 14 è il notebook c...
Microsoft Surface Pro 12 è il 2 in 1 più compatto e silenzioso Microsoft Surface Pro 12 è il 2 in 1 pi&u...
Recensione REDMAGIC Astra Gaming Tablet: che spettacolo di tablet! Recensione REDMAGIC Astra Gaming Tablet: che spe...
Dopo un mese, e 50 foto, cosa abbiamo capito della nuova Nintendo Switch 2 Dopo un mese, e 50 foto, cosa abbiamo capito del...
Gigabyte Aero X16 Copilot+ PC: tanta potenza non solo per l'IA Gigabyte Aero X16 Copilot+ PC: tanta potenza non...
Finalmente rilevata la stella compagna d...
UBTech Walker S2: il robot umanoide cine...
Musk guarda ai più piccoli: in ar...
The Witcher 3 su RISC-V? Ora è po...
Il segreto per lavorare meglio? È...
Mini PC con 16GB RAM e 512GB SSD a poco ...
Radeon RX 9000: questa app gratuita cons...
Windows 11 supporterà la condivis...
Synology DS725+: connettività 2.5...
Microsoft vuole dire addio ai problemi d...
I giocatori si divertono a spendere di p...
Il monopattino che punta a battere il re...
Apple e crittografia, Londra verso la re...
Trump pubblica video con Obama arrestato...
A Vienna consegne postali completamente ...
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: 21:06.


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