|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
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)); ... |
![]() |
![]() |
![]() |
#2 | |
Senior Member
Iscritto dal: Mar 2007
Città: Milano Beach
Messaggi: 1696
|
strtok()
Quote:
__________________
~ Cthulhu: MacBookPro 13.3" ~ Azathoth: D510MO |
|
![]() |
![]() |
![]() |
#3 |
Senior Member
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, ":")); ![]()
__________________
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 |
![]() |
![]() |
![]() |
#4 |
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
![]() |
![]() |
![]() |
![]() |
#5 |
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? |
![]() |
![]() |
![]() |
#6 |
Senior Member
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 |
![]() |
![]() |
![]() |
#7 |
Member
Iscritto dal: Aug 2009
Messaggi: 119
|
grazie
![]() |
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 14:59.