Torna indietro   Hardware Upgrade Forum > Software > Programmazione

iPhone 17 Pro: più di uno smartphone. È uno studio di produzione in formato tascabile
iPhone 17 Pro: più di uno smartphone. È uno studio di produzione in formato tascabile
C'è tanta sostanza nel nuovo smartphone della Mela dedicato ai creator digitali. Nuovo telaio in alluminio, sistema di raffreddamento vapor chamber e tre fotocamere da 48 megapixel: non è un semplice smartphone, ma uno studio di produzione digitale on-the-go
Intel Panther Lake: i processori per i notebook del 2026
Intel Panther Lake: i processori per i notebook del 2026
Panther Lake è il nome in codice della prossima generazione di processori Intel Core Ultra, che vedremo al debutto da inizio 2026 nei notebook e nei sistemi desktop più compatti. Nuovi core, nuove GPU e soprattutto una struttura a tile che vede per la prima volta l'utilizzo della tecnologia produttiva Intel 18A: tanta potenza in più, ma senza perdere in efficienza
Intel Xeon 6+: è tempo di Clearwater Forest
Intel Xeon 6+: è tempo di Clearwater Forest
Intel ha annunciato la prossima generazione di processori Xeon dotati di E-Core, quelli per la massima efficienza energetica e densità di elaborazione. Grazie al processo produttivo Intel 18A, i core passano a un massimo di 288 per ogni socket, con aumento della potenza di calcolo e dell'efficienza complessiva.
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 23-06-2011, 15: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, 16: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, 16: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, 16: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, 17: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, 18: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, 18:12   #7
agosteeno
Member
 
Iscritto dal: Aug 2009
Messaggi: 119
grazie
agosteeno è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


iPhone 17 Pro: più di uno smartphone. È uno studio di produzione in formato tascabile iPhone 17 Pro: più di uno smartphone. &Eg...
Intel Panther Lake: i processori per i notebook del 2026 Intel Panther Lake: i processori per i notebook ...
Intel Xeon 6+: è tempo di Clearwater Forest Intel Xeon 6+: è tempo di Clearwater Fore...
4K a 160Hz o Full HD a 320Hz? Titan Army P2712V, a un prezzo molto basso 4K a 160Hz o Full HD a 320Hz? Titan Army P2712V,...
Recensione Google Pixel Watch 4: basta sollevarlo e si ha Gemini sempre al polso Recensione Google Pixel Watch 4: basta sollevarl...
Nuovo storico lancio per il razzo spazia...
Elgato Embrace: una sedia ergonomica pro...
Brad Pitt torna in pista: F1 – Il Film a...
Hitachi Vantara annuncia la sua AI Facto...
Brembo passa all'alluminio riciclato al ...
HONOR pronta a sfidare gli iPad Pro con ...
OpenAI esce allo scoperto: confermati i ...
In arrivo altri due prodotti da Apple en...
Il tool per aggiornare da Windows 10 a W...
Rishi Sunak entra in Microsoft e Anthrop...
Porsche in poche ore chiude la formazion...
iPhone 17 disponibili su Amazon al prezz...
La Ferrari Elettrica non è la cau...
Ricarica da record: Zeekr supera i 1.300...
Un 'capezzolo' con feedback aptico al po...
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:14.


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