PDA

View Full Version : [C/C++] dividere una stringa


misterx
02-04-2012, 15:48
ciao,
premetto che per suddividere le stringhe che ho in ingresso uso la funzione token() dello standard C.

In ingresso mi arrivano stringhe per le quali devo considerare 4 campi principali:

data
orario
dimensioni
nomefile

Per quanto riguarda i primi 3 campi non vi sono problemi in quanto sono dati gestiti dal sistema il quale no inserisce spazi tra i vari caratteri.

Il campo nomefile invece è costituito da ogni sorta di carattere, spazi compresi. In questo caso ho risolto semplicemente dichiarando una matrice di puntatori nel modo seguente:


char *p;
char *campo[10];
int r=0;

p = strtok(stringa, " ");

while (p != NULL)
{
campo[r++]=p;
p = strtok(NULL, " ");
}


Il risultato che ottengo letta la stringa di input è:

campo[0] = 10/02/2010
campo[2] = 12.30
campo[3] = 12.715
campo[4] = parte del nome del file
campo[5] = parte del nome del file
campo[6] = parte del nome del file
etc ......

Siccome il nome del file mi interessa avero in un solo campo, il campo[4] con un ciclo for concateno al campo[4] il campo[6],....6,....7,....n

Il problema è che non mi sembra un sistema molto furbo anche se funziona; c'è un modo usando i puntatori di copiare nel campo[4] la rimanenza della stringa tralasciando ciò che è già stato inserito nei precedenti 3 campi?

grazie

ESSE-EFFE
02-04-2012, 17:13
Il problema è che non mi sembra un sistema molto furbo anche se funziona; c'è un modo usando i puntatori di copiare nel campo[4] la rimanenza della stringa tralasciando ciò che è già stato inserito nei precedenti 3 campi?
In effetti non è molto furbo, anche perchè dovresti allocare i puntatori dinamicamente visto che non puoi sapere quanti spazi ci sono.

Non usare la strtok. Scorri i caratteri della stringa con un semplice for. Se incontri uno spazio, al carattere successivo inizierà un campo (lo spazio forzalo al terminatore nullo così ti sistema il campo precedente). Questo per i primi 3 campi. Quando sai l'inizio del quarto campo (il nome del file in questo caso) puoi uscire dal ciclo.

Se stai usando C e non C++, usa [C] nel titolo.

misterx
02-04-2012, 17:40
In effetti non è molto furbo, anche perchè dovresti allocare i puntatori dinamicamente visto che non puoi sapere quanti spazi ci sono.

Non usare la strtok. Scorri i caratteri della stringa con un semplice for. Se incontri uno spazio, al carattere successivo inizierà un campo (lo spazio forzalo al terminatore nullo così ti sistema il campo precedente). Questo per i primi 3 campi. Quando sai l'inizio del quarto campo (il nome del file in questo caso) puoi uscire dal ciclo.

Se stai usando C e non C++, usa [C] nel titolo.

avevo pensato anche a questo però, avendo a disposizione il terzo puntatore ritornato dalla strtok() pensavo si potesse in un qualche modo memporizzare nel campo[4] la rimanente stringa, questo attraverso un qualche assegnamento che non conosco, una qualche artitmetica strana coi puntatori che spostasse l'inizio di stringa al terzo indirizzo ritornato dalla strtok() :)

ESSE-EFFE
02-04-2012, 17:51
avevo pensato anche a questo però, avendo a disposizione il terzo puntatore ritornato dalla strtok() pensavo si potesse in un qualche modo memporizzare nel campo[4] la rimanente stringa, questo attraverso un qualche assegnamento che non conosco, una qualche artitmetica strana coi puntatori che spostasse l'inizio di stringa al terzo indirizzo ritornato dalla strtok() :)

Se proprio vuoi usare la strtok puoi fare in maniera analoga a quanto ho già spiegato: una volta che ti viene restituito il quarto puntatore interrompi la ricerca. Automaticamente punterà ai restanti caratteri della stringa.

misterx
02-04-2012, 21:55
grazie per le dritte.

Ho trovato un sistema ancora più banale