|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Jul 2001
Messaggi: 9947
|
[C] Buffer di caratteri: inizializzarlo & funzioni per stringhe
Non so se è corretto, ma io faccio così:
Codice:
titolo_str[0]='\0'; strcpy(titolo_str, "##### TITOLO DEL ITEM #####\n"); Secondo me no, perchè se il buffer è sporco, nel concatenare può fare dei casini. Ammesso che pulire/ripulire/inizializzare 1 buffer di caratteri si faccia come faccio io.
__________________
Aiuta la ricerca col tuo PC: >>Calcolo distribuito BOINC.Italy: unisciti anche tu<< Più largo è il sorriso, più affilato è il coltello. |
|
|
|
|
|
#2 |
|
Member
Iscritto dal: Feb 2007
Messaggi: 38
|
Per inizializzare un buffer si fa così di solito:
Codice:
memset(buffer, 0, DIMENSIONE_BUFFER); Per riempirlo è meglio che usi la versione sicura di strcpy,ovvero strncpy che ti aiuta a prevenire pericolosi buffer overflow. |
|
|
|
|
|
#3 | |
|
Senior Member
Iscritto dal: Jul 2001
Messaggi: 9947
|
Quote:
Codice:
void pulisci_str(char *stringa, int lunghezza)
{
int i;
for (i=0; i<lunghezza; ++i) { stringa[i]='\0'; }
}
__________________
Aiuta la ricerca col tuo PC: >>Calcolo distribuito BOINC.Italy: unisciti anche tu<< Più largo è il sorriso, più affilato è il coltello. |
|
|
|
|
|
|
#4 | |
|
Senior Member
Iscritto dal: Jul 2001
Messaggi: 9947
|
Quote:
Cancello la mia funzione e uso memset?!
__________________
Aiuta la ricerca col tuo PC: >>Calcolo distribuito BOINC.Italy: unisciti anche tu<< Più largo è il sorriso, più affilato è il coltello. |
|
|
|
|
|
|
#5 |
|
Senior Member
Iscritto dal: Jul 2001
Messaggi: 9947
|
Ovvero come si usa sta strncopy?!
__________________
Aiuta la ricerca col tuo PC: >>Calcolo distribuito BOINC.Italy: unisciti anche tu<< Più largo è il sorriso, più affilato è il coltello. |
|
|
|
|
|
#6 | |
|
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
Es. Codice:
char str[50]; strcpy (str, "Hello"); strcat (str, " World");
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|
|
|
|
|
|
#7 | |
|
Member
Iscritto dal: Feb 2007
Messaggi: 38
|
Quote:
Metti il caso, invece, che tu stia facendo un'applicazione di rete e che debba copiare il contenuto di una stringa ricevuta in input dall'utente. Nel migliore delle ipotesi l'utente ingenuamente passa una stringa più lunga del tuo buffer e il programma va in crash. Nel peggiore dei casi, invece, trovi un hacker che ti provoca un bel buffer overflow e prende il controllo della tua macchina. Quindi è buona norma scordarsi completamente della strcpy e usare strncpy che permette di limitare il numero di caratteri copiati nel tuo buffer. |
|
|
|
|
|
|
#8 |
|
Senior Member
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
|
Alternativamente, invece che malloc(), potrebbe anche usare calloc() al momento dell'allocazione, visto che azzera da sola il contenuto della memoria allocata.
__________________
C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai! |
|
|
|
|
|
#9 |
|
Senior Member
Iscritto dal: Jul 2001
Messaggi: 9947
|
Come diceva qualcuno è 1 apz che cicla con quei buffer che erano variabili globali.
Quindi ho pensato di cambiare tecnica adesso: ho fatto che togliere i buffer di dimensioni fisse, ed adopero la seguente tenica adesso: bla bla bla lunghezza=strlen(""); str_tmp=(char*) calloc(lunghezza, sizeof(char)); sprintf(str_tmp, "e%d = ImageReader(\"no_input.png\",0,250,25.00).ConvertToYV12()\n", count_item); strcat(enclosure_str, str_tmp); free(str_tmp); bla bla bla Speriamo di non aver fatto 1
__________________
Aiuta la ricerca col tuo PC: >>Calcolo distribuito BOINC.Italy: unisciti anche tu<< Più largo è il sorriso, più affilato è il coltello. Ultima modifica di Matrixbob : 11-03-2007 alle 14:14. |
|
|
|
|
|
#10 | |
|
Senior Member
Iscritto dal: Jul 2001
Messaggi: 9947
|
Quote:
[PS] Ma mettere tutti \0 equivale a riempire la stringa di 0?!
__________________
Aiuta la ricerca col tuo PC: >>Calcolo distribuito BOINC.Italy: unisciti anche tu<< Più largo è il sorriso, più affilato è il coltello. Ultima modifica di Matrixbob : 11-03-2007 alle 14:15. |
|
|
|
|
|
|
#11 | |
|
Senior Member
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
|
Quote:
Secondo, '\0' è una sequenza di escape, e non va a riempire ogni carattere della stringa con il carattere '0' (ASCII 49), ma con un carattere non visualizzabile che indica un carattere nullo (ASCII 0, usato appunto come terminatore di stringa dalle operazioni del C).
__________________
C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai! |
|
|
|
|
|
|
#12 | ||
|
Senior Member
Iscritto dal: Jul 2001
Messaggi: 9947
|
Quote:
Quote:
Codice:
//richiamata
pulisci_str(stringa, SIZEBUF);
//definita
void pulisci_str(char *stringa, int lunghezza)
{
int i;
for (i=0; i<lunghezza; ++i) { stringa[i]='\0'; }
}
Codice:
memset(buffer, 0, DIMENSIONE_BUFFER); Codice:
memset(buffer, '\0', DIMENSIONE_BUFFER);
__________________
Aiuta la ricerca col tuo PC: >>Calcolo distribuito BOINC.Italy: unisciti anche tu<< Più largo è il sorriso, più affilato è il coltello. Ultima modifica di Matrixbob : 11-03-2007 alle 14:45. |
||
|
|
|
|
|
#13 |
|
Senior Member
Iscritto dal: Jul 2001
Messaggi: 9947
|
Ma soprattutto, questa tecnica ora è corretta, funziona?!
bla bla bla lunghezza=strlen(""); str_tmp=(char*) calloc(lunghezza, sizeof(char)); sprintf(str_tmp, "e%d = ImageReader(\"no_input.png\",0,250,25.00).ConvertToYV12()\n", count_item); strcat(enclosure_str, str_tmp); free(str_tmp); bla bla bla
__________________
Aiuta la ricerca col tuo PC: >>Calcolo distribuito BOINC.Italy: unisciti anche tu<< Più largo è il sorriso, più affilato è il coltello. |
|
|
|
|
|
#14 |
|
Senior Member
Iscritto dal: Jul 2001
Messaggi: 9947
|
ARRIVANO I GUAI: pare che la sprintf mi scazzi le stringhe!
Pezzo del mio codice: lunghezza=strlen("##### TITOLO DEL ITEM #####\n"); titolo_str=(char*) calloc(lunghezza, sizeof(char)); strcpy(titolo_str, "##### TITOLO DEL ITEM #####\n"); printf("titolo_str: %s\n", titolo_str); getchar(); lunghezza=strlen(""); str_tmp=(char*) calloc(lunghezza, sizeof(char)); printf("str_tmp1: %s\n", str_tmp); printf("canale_titolo: %s", canale_titolo); getchar(); sprintf(str_tmp, "bottom_subs%d = Subtitle(bottom,\"\"\"%s\\n", count_item, canale_titolo); printf("str_tmp2: %s\n", str_tmp); getchar(); strcat(titolo_str, str_tmp); printf("titolo_str: %s\n", titolo_str); getchar(); free(str_tmp); ![]() Cavolo mi sono proprio impastato!!! ![]() Qui ho proprio bisogno di 1 vostro aiuto. Forse le stringhe che hanno a che fare con sprintf è meglio se le lascio di dimensione fissa sovradimensionata?!
__________________
Aiuta la ricerca col tuo PC: >>Calcolo distribuito BOINC.Italy: unisciti anche tu<< Più largo è il sorriso, più affilato è il coltello. Ultima modifica di Matrixbob : 11-03-2007 alle 16:05. |
|
|
|
|
|
#15 |
|
Senior Member
Iscritto dal: Jul 2001
Messaggi: 9947
|
Adesso ho fatto così, ma ho paura che scazzi nuovamente quando i %s e %d vengono sostituiti:
lunghezza=strlen("##### TITOLO DEL ITEM #####\n"); titolo_str=(char*) calloc(lunghezza, sizeof(char)); strcpy(titolo_str, "##### TITOLO DEL ITEM #####\n"); lunghezza=strlen("bottom_subs%d = Subtitle(bottom,\"\"\"%s\\n"); str_tmp=(char*) calloc(lunghezza, sizeof(char)); sprintf(str_tmp, "bottom_subs%d = Subtitle(bottom,\"\"\"%s\\n", count_item, canale_titolo); strcat(titolo_str, str_tmp); free(str_tmp); ... però attendo fiducioso da voi il giusto verbo!!
__________________
Aiuta la ricerca col tuo PC: >>Calcolo distribuito BOINC.Italy: unisciti anche tu<< Più largo è il sorriso, più affilato è il coltello. Ultima modifica di Matrixbob : 11-03-2007 alle 16:22. |
|
|
|
|
|
#16 | |
|
Member
Iscritto dal: Feb 2007
Messaggi: 38
|
Quote:
Tu vuoi copiare una stringa di cui non conosci a priori la lunghezza (a causa della formattazione di sprintf) . Dovresti fare così: 1) Usi snprintf e non sprintf che ti permette di limitare il caratteri copiati (guardati il manuale per sapere come funziona) 2) Algoritmo "serio" : crei un buffer di dimensioni piccole(anche 0 byte) con malloc, copi la stringa con snprintf , guardi il valore di ritorno, se questo è maggiore della dimensione del buffer vuol dire che il buffer non bastava e la stringa è stata troncata, in questo caso devi riallocare il buffer creandolo più grande (pari al valore di ritorno dell snprintf+1) e riprovi a fare la copia. Ultima modifica di xorshadow : 11-03-2007 alle 18:45. |
|
|
|
|
|
|
#17 | |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Quote:
L'unico modo per dimensionare in modo corretto la stringa è convertire prima su un buffer temporaneo count_item. char template[] = "e%d = ImageReader(\"no_input.png\",0,250,25.00).ConvertToYV12()\n"; str_tmp = (char *)malloc(12 * sizeof(char)); sprintf(str_tmp, "%d", count_item); lunghezza = strlen(str_tmp) + strlen(template) - 2; //-2 perché tolgo i caratteri dovuti a "%d" free(str_temp); str_tmp = (char *)malloc((lunghezza + 1) * sizeof(char)); sprintf(str_tmp, template, count_item); strcat(enclosure_str, str_tmp); free(str_temp); Ricordati che perà enclosure_str deve avere abbastanza spazio per contenere anche l'altra stringa.. |
|
|
|
|
|
|
#18 |
|
Member
Iscritto dal: Feb 2007
Messaggi: 38
|
Come ho già detto prima (versione semplificata e senza error check):
Codice:
nchars = snprintf(NULL, 0, "Quello che %s devi %d formattare", arg1, arg2); char* buff = malloc(nchars + 1); snprintf(buff,nchars + 1,"Quello che %s devi %d formattare", arg1, arg2); Ultima modifica di xorshadow : 11-03-2007 alle 20:32. |
|
|
|
|
|
#19 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Interessante questa snprintf...non la conoscevo. Ho visto che è anche nello standard C99, ottimo
|
|
|
|
|
|
#20 |
|
Senior Member
Iscritto dal: Jul 2001
Messaggi: 9947
|
Bene bene, s'imparano sempre delle belle cose.
C'è anche la matrixNbob function?! Mi farò 1 bel stamp di questo 3D poi come promemoria.
__________________
Aiuta la ricerca col tuo PC: >>Calcolo distribuito BOINC.Italy: unisciti anche tu<< Più largo è il sorriso, più affilato è il coltello. |
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 11:20.





















