Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Nuova Dacia Spring, del modello precedente resta solo il nome: più grande, più efficiente e ora prodotta in Europa
Nuova Dacia Spring, del modello precedente resta solo il nome: più grande, più efficiente e ora prodotta in Europa
La seconda generazione della citycar elettrica di Dacia passa alla piattaforma RGEV small di Renault Group, cresce di 15 cm in lunghezza e 18 cm in larghezza, adotta un motore da 80 CV e una batteria LFP da 27,5 kWh per 250 km WLTP. Prezzi da 17.900 euro, produzione a Novo Mesto in Slovenia.
BOOX Picco: l'ebook reader minuscolo è una genialata, e si può attaccare allo smartphone
BOOX Picco: l'ebook reader minuscolo è una genialata, e si può attaccare allo smartphone
BOOX ha portato sul mercato Picco, un e-reader da 3,97 pollici che pesa 58 grammi e si aggancia al retro dello smartphone con un anello magnetico. Lo abbiamo usato con Pixel 11 Pro XL e iPhone 18 Pro per capire se un formato così ridotto regga la prova della lettura quotidiana
AMD EPYC Venice: dentro Zen 6, i SoC a 256 core e la sfida al costo della memoria
AMD EPYC Venice: dentro Zen 6, i SoC a 256 core e la sfida al costo della memoria
A Las Vegas AMD ha svelato i dettagli architetturali delle CPU EPYC di sesta generazione, note con il nome in codice Venice. Nuovi core Zen 6 e Zen 6c costruiti a 2 nanometri, fino a 256 core per socket, 16 canali di memoria, interfaccia PCI Express 6.0 e un'intera famiglia di proposte che va da Venice SP7 a Verano. Senza dimenticare la memoria, oggi la voce di costo più pesante in un server: AMD risponde con CXL 3.1 e con la tecnologia software MEXT, che porta la memoria flash dentro la gerarchia della DRAM.
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 23-06-2011, 16:30   #1
agosteeno
Member
 
Iscritto dal: Aug 2009
Messaggi: 119
[c] malloc e strtok: costruire stringhe senza sapere quanto sono grandi

Salve a tutti, ho un problema che non so' come risolvere: In pratica ho una funzione che riceve una stringa. Questa contiene 3 sottostringhe che sono delimitate da un carattere particolare. Io voglio ottenere queste e metterle in stringhe allocate dinamicamente con una malloc. Il problema sta' nel fatto che a priori non posso sapere di quanto dover fare la malloc, perche' la dimensione la posso sapere solo dopo aver fatto la strtok. La soluzione che mi viene in mente sarebbe di usare un array di caratteri come tampone (so' quale e' la dimensione massima della stringa e quindi posso creare una cosa del genere: char buffer[MAXDIM]; ) calcolare la dimensione di quanto messo qua dentro e poi fare la malloc di conseguenza. Il fatto e' che mi sembra un po' macchinoso e forzato. Qualcuno ha un idea su come poter risolvere con un po' piu' di eleganza questo problema? Questo sarebbe il codice che farei io:
Codice:
char *sorgente;
char *destinazione;
char *distanza;
char buffer[MAXDIM];
int i = 1;
char c;
strcpy(buffer, strtok(temp, ":"));

c = buffer[0];

while(c != '\0'){
   i++;
}

sorgente = malloc(i * sizeof(char));

...
e cosi' via per il resto...
agosteeno è offline   Rispondi citando il messaggio o parte di esso
Old 23-06-2011, 17:12   #2
GByTe87
Senior Member
 
L'Avatar di GByTe87
 
Iscritto dal: Mar 2007
Città: Milano Beach
Messaggi: 1696
strtok()

Quote:
A sequence of calls to this function split str into tokens, which are sequences of contiguous characters separated by any of the characters that are part of delimiters.

On a first call, the function expects a C string as argument for str, whose first character is used as the starting location to scan for tokens. In subsequent calls, the function expects a null pointer and uses the position right after the end of last token as the new starting location for scanning.

To determine the beginning and the end of a token, the function first scans from the starting location for the first character not contained in delimiters (which becomes the beginning of the token). And then scans starting from this beginning of the token for the first character contained in delimiters, which becomes the end of the token.

This end of the token is automatically replaced by a null-character by the function, and the beginning of the token is returned by the function.

Once the terminating null character of str has been found in a call to strtok, all subsequent calls to this function with a null pointer as the first argument return a null pointer.
Quindi nulla ti vieta di usare un strlen per capire quant'è lunga la sequenza di caratteri restituita da strtok.
__________________
~ Cthulhu: MacBookPro 13.3" ~ Azathoth: D510MO
GByTe87 è offline   Rispondi citando il messaggio o parte di esso
Old 23-06-2011, 17:14   #3
maulattu
Senior Member
 
L'Avatar di maulattu
 
Iscritto dal: Mar 2005
Città: ~
Messaggi: 740
usa la strtok_r (*nix) oppure strtok_s (windows) se devi usare i thread.
e, come buona abitudine, usa strncpy; questo:
Codice:
strcpy(buffer, strtok(temp, ":"));
è un inno al buffer overflow
__________________
Ciao ciao cagnolino Billy
MacMini late 2009, 2.53GHz, 4GB ram, 320GB hard disk, Snow Leopard 10.8.2 - iPod Nano 6th gen.
XBOX Live GamerTag: InsaneMau
maulattu è offline   Rispondi citando il messaggio o parte di esso
Old 23-06-2011, 17:20   #4
agosteeno
Member
 
Iscritto dal: Aug 2009
Messaggi: 119
Hai ragione, alla strlen non avevo pensato. Per quanto riguada gli altri suggerimenti non vi preoccupate, terro' le considerazioni opportune. Ciao e grazie mille
agosteeno è offline   Rispondi citando il messaggio o parte di esso
Old 23-06-2011, 18:12   #5
agosteeno
Member
 
Iscritto dal: Aug 2009
Messaggi: 119
Giusto un'ultima cosa: se la stringa che arriva come parametro e' malformata (nel senso che non ha il formato previsto) la strcpy(buffer, strtok()) mi da' problemi. Per esempio, la mia stringa ha in generale questo formato:

abc:def:ghi


quindi farei 3 strtok, ma se per esempio trovo una stringa cosi':

abc:def:

la 3' operazione mi dara' problemi. Come potrei fare per controllare prima?
agosteeno è offline   Rispondi citando il messaggio o parte di esso
Old 23-06-2011, 19:00   #6
GByTe87
Senior Member
 
L'Avatar di GByTe87
 
Iscritto dal: Mar 2007
Città: Milano Beach
Messaggi: 1696
Guarda l'esempio di strtok contenuto nel link che ho postato poco fa; la strtok viene eseguita (a parte la prima volta) in un ciclo in cui ne viene controllato il valore restituito, confrontandolo con NULL.
__________________
~ Cthulhu: MacBookPro 13.3" ~ Azathoth: D510MO
GByTe87 è offline   Rispondi citando il messaggio o parte di esso
Old 23-06-2011, 19:12   #7
agosteeno
Member
 
Iscritto dal: Aug 2009
Messaggi: 119
grazie
agosteeno è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Nuova Dacia Spring, del modello precedente resta solo il nome: più grande, più efficiente e ora prodotta in Europa Nuova Dacia Spring, del modello precedente resta...
BOOX Picco: l'ebook reader minuscolo è una genialata, e si può attaccare allo smartphone BOOX Picco: l'ebook reader minuscolo è un...
AMD EPYC Venice: dentro Zen 6, i SoC a 256 core e la sfida al costo della memoria AMD EPYC Venice: dentro Zen 6, i SoC a 256 core ...
HONOR Pad X9 Max recensione, schermo ultra large a meno di 400 euro HONOR Pad X9 Max recensione, schermo ultra large...
Lenovo ThinkPad X1 Carbon Gen 14: il business ultraleggero si rinnova dall’interno Lenovo ThinkPad X1 Carbon Gen 14: il business ul...
Alice Huang avrebbe avuto interessi in s...
Khronos Group pensa ad API standard per ...
Account GitHub rubati raggiungono oltre ...
AMD corre ai ripari: un aggiornamento Ra...
Jensen Huang, spunta una terza relazione...
Chi può sostituire Jensen Huang a...
Rilasciati i primi dati raccolti dal tel...
Leica M-A Hammertone e Leica M11-P Hamme...
L'IA non sostituisce la creatività...
Anche Formula E cambia il calendario per...
Defender contro BYD Ti 7: il giudice d&a...
32GB di RAM DDR4 a un prezzo sorprendent...
La nuova lavagna interattiva di LG arriv...
Lo smartphone Samsung passa da 16:9 a 21...
OPPO Pad 5 Pro arriva in Italia: display...
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: 08:57.


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