Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Recensione Borderlands 4, tra divertimento e problemi tecnici
Recensione Borderlands 4, tra divertimento e problemi tecnici
Gearbox Software rilancia la saga con Borderlands 4, ora disponibile su PS5, Xbox Series X|S e PC. Tra le novità spiccano nuove abilità di movimento, un pianeta inedito da esplorare e una campagna che lascia al giocatore piena libertà di approccio
TCL NXTPAPER 60 Ultra: lo smartphone che trasforma la lettura da digitale a naturale
TCL NXTPAPER 60 Ultra: lo smartphone che trasforma la lettura da digitale a naturale
NXTPAPER 60 Ultra è il primo smartphone con tecnologia NXTPAPER 4.0 per il display, un ampio IPS da 7,2 pollici. Con finitura anti-riflesso, processore MediaTek Dimensity 7400, fotocamera periscopica e modalità Max Ink per il detox digitale, NXTPAPER 60 Ultra punta a essere il riferimento tra gli smartphone pensati per il benessere degli occhi.
Un fulmine sulla scrivania, Corsair Sabre v2 Pro ridefinisce la velocità nel gaming
Un fulmine sulla scrivania, Corsair Sabre v2 Pro ridefinisce la velocità nel gaming
Questo mouse ultraleggero, con soli 36 grammi di peso, è stato concepito per offrire un'esperienza di gioco di alto livello ai professionisti degli FPS, grazie al polling rate a 8.000 Hz e a un sensore ottico da 33.000 DPI. La recensione esplora ogni dettaglio di questo dispositivo di gioco, dalla sua agilità estrema alle specifiche tecniche che lo pongono un passo avanti
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: 592
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


Recensione Borderlands 4, tra divertimento e problemi tecnici Recensione Borderlands 4, tra divertimento e pro...
TCL NXTPAPER 60 Ultra: lo smartphone che trasforma la lettura da digitale a naturale TCL NXTPAPER 60 Ultra: lo smartphone che trasfor...
Un fulmine sulla scrivania, Corsair Sabre v2 Pro ridefinisce la velocità nel gaming Un fulmine sulla scrivania, Corsair Sabre v2 Pro...
Nokia Innovation Day 2025: l’Europa ha bisogno di campioni nelle telecomunicazioni Nokia Innovation Day 2025: l’Europa ha bisogno d...
Sottile, leggero e dall'autonomia WOW: OPPO Reno14 F conquista con stile e sostanza Sottile, leggero e dall'autonomia WOW: OPPO Reno...
Samsung Galaxy S26 Ultra: la ricarica sa...
Disagi al traffico aereo europeo: le ind...
Intel in crisi chiama Apple: un riavvici...
Snapdragon X2 Elite Extreme, il cuore de...
Snapdragon 8 Elite Gen 5 è il nuovo rife...
Bombe Apple su Amazon: iPhone di scorsa ...
Micron: memoria HBM4 a 11 Gbps e patto d...
NVIDIA rende Audio2Face open source: ecc...
Logitech Signature Slim Solar K980+: 10 ...
Disney Plus aumenta i prezzi: si parte d...
Intel XeSS con Multi Frame Generation: u...
iPhone 16 a soli 700€ su Amazon: stile e...
Signature Slim Solar+ K980, la nuova tas...
Logitech MX Master 3S, il mouse perfetto...
Borderlands 4 per Switch 2 rinviato a te...
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: 06:21.


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