Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Il tablet rugged leggero e sottile: Lenovo ThinkTab X11 offre resistenza, doppia USB-C e batteria rimovibile
Il tablet rugged leggero e sottile: Lenovo ThinkTab X11 offre resistenza, doppia USB-C e batteria rimovibile
Lenovo ha lanciato il ThinkTab X11 rimettendo piede nel segmento dei tablet Android con il marchio Think dopo oltre un decennio di assenza. Il risultato è un dispositivo che prende una direzione precisa: massima dotazione funzionale, costruzione resistente, autonomia fuori dagli schemi
AMD Advancing AI 2026: l'hardware AMD per le elaborazioni IA del futuro, tra GPU, CPU e robot
AMD Advancing AI 2026: l'hardware AMD per le elaborazioni IA del futuro, tra GPU, CPU e robot
AMD Advancing AI è l'appuntamento annuale con il quale l'azienda americana mostra quelle che sono le proprie novità dal versante datacenter. Tra piattaforma Helios, GPU Instinct MI455X e processori EPYC di sesta generazione tutto quello che serve per processare l'IA sempre più complessa ed esigente
Tascabile e con Android: BOOX Go 6 Gen II è diverso da tutti gli altri e-reader
Tascabile e con Android: BOOX Go 6 Gen II è diverso da tutti gli altri e-reader
BOOX Go 6 Gen II porta per la prima volta il supporto allo stilo su un e-reader da 6 pollici, affiancando 3 GB di RAM al collaudato Snapdragon 665 e un design rivisto con scocca posteriore a costolature. Su carta la proposta è interessante, ma Android 11 fuori supporto, l'assenza di un alloggiamento per il pennino e un'autonomia ridotta rispetto agli e-reader tradizionali sono i compromessi da accettare
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


Il tablet rugged leggero e sottile: Lenovo ThinkTab X11 offre resistenza, doppia USB-C e batteria rimovibile Il tablet rugged leggero e sottile: Lenovo Think...
AMD Advancing AI 2026: l'hardware AMD per le elaborazioni IA del futuro, tra GPU, CPU e robot AMD Advancing AI 2026: l'hardware AMD per le ela...
Tascabile e con Android: BOOX Go 6 Gen II è diverso da tutti gli altri e-reader Tascabile e con Android: BOOX Go 6 Gen II &egrav...
Recensione Lenovo Idea Tab Plus: il tablet da 12 pollici che costa meno di 300 euro Recensione Lenovo Idea Tab Plus: il tablet da 12...
Oltre il contante e le crypto: tutto sull'Euro Digitale e la nuova sovranità monetaria europea Oltre il contante e le crypto: tutto sull'Euro D...
SpaceX ha lanciato il razzo spaziale Sta...
Anthropic lancia Claude Opus 5: eclissa ...
Batterie a terra per Varta, bancarotta v...
Elon Musk: l'intelligenza artificiale su...
Ryzen 7 9800HX3D: il miglior processore ...
Google porta Gemini Live sui vecchissimi...
Corsair Platform:4 in offerta: la scriva...
Il creatore di Disagea sull'addio dei gi...
Fastweb + Vodafone entra nello SmartCity...
AI Act europeo: dal 2 agosto partono i n...
Da 1,3 a 10 miliardi in due mesi: chi è ...
Schede video RTX: NVIDIA comunica nuovi ...
GTA 6, i 60 fps stabili potrebbero esser...
Questa Smart TV QLED da 40 pollici con H...
Ring in sconto fino al 57%: videocitofon...
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: 03:36.


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