View Full Version : [C]Contare occorrenze di parole in una stringa
xglobusx
02-09-2005, 22:50
Ciao
ho un file con stringhe di questo tipo:
A punto punto stilo clio stilo
B punto stilo clio punto punto
voglio fare una lista con questa struct
struct car{
char nomemacchina[20];
int numerodisponibili;
struct car *next;
}
come faccio ad estrarre da una stringa le singole parole e raggruppare quelle dello stipo?
Forse contando gli spazi usando ciclo di strtok?
Ciao
ho un file con stringhe di questo tipo:
A punto punto stilo clio stilo
B punto stilo clio punto punto
voglio fare una lista con questa struct
struct car{
char nomemacchina[20];
int numerodisponibili;
struct car *next;
}
come faccio ad estrarre da una stringa le singole parole e raggruppare quelle dello stipo?
Forse contando gli spazi usando ciclo di strtok?
Ci sono molti metodi per realizzare il tuo compito. Visto che i nomi delle macchine sono su due righe, potresti procedere con una normale lettura fino ad incontrare il carattare di nuova riga (e leggendo una parola ad ogni spazio incontrato).
In ogni caso, per la strtok() e la strtok_r():
Never use these functions. If you do, note that:
These functions modify their first argument.
These functions cannot be used on constant strings.
The identity of the delimiting character is lost.
The strtok() function uses a static buffer while parsing, so
it's not thread safe. Use strtok_r() if this matters to you.
:sofico:
xglobusx
03-09-2005, 11:05
grazie mi sa che la strtok la lascio perdere!
che funzione legge una parola fino allo spazio?
Cmq in realtà volevo fare una lista di liste così
struct car{
char nome_macchina[10];
int quantità;
struct car *succ;
}
struct sede{
char nomesede[10]; //prima le ho indicate con A e B
struct sede *next;
struct car *c_next;
}
devo raggruppare i vari tipi di macchine per A per B ecc.
che funzione legge una parola fino allo spazio?
fscanf...
RaouL_BennetH
03-09-2005, 13:35
Ci sono molti metodi per realizzare il tuo compito. Visto che i nomi delle macchine sono su due righe, potresti procedere con una normale lettura fino ad incontrare il carattare di nuova riga (e leggendo una parola ad ogni spazio incontrato).
In ogni caso, per la strtok() e la strtok_r():
Never use these functions. If you do, note that:
These functions modify their first argument.
These functions cannot be used on constant strings.
The identity of the delimiting character is lost.
The strtok() function uses a static buffer while parsing, so
it's not thread safe. Use strtok_r() if this matters to you.
:sofico:
:eek:
Dannazione!! Ho un programma che usa strtok per prendermi solo 4 caratteri dall'interno di una stringa:
newinput = strtok(input, ">");
newinput = strtok(NULL, "<");
E questo perchè deve prendermi soltanto ciò che è racchiuso tra ">" e "<".
Cosa posso usare al posto di strtok quindi?
Dai alla fine strtok() non è il male :) In quel post che ho fatto dice "Never use these functions" per il fatto che bisogna stare attenti a molte cose durante l'uso di quella funzione. Il maggior problema è che modifica l'argomento, di conseguenza è pericolosa perchè non permette di scegliere al programmatore se passare un parametro "per valore" o " per riferimento", quindi dimenticandosi di questa funzione, da qualche altra parte del programma si potrebbe dichiarare qualcosa che potrebbe portare a dei malfunzionamenti. In ogni caso se si considera tutto ciò che c'è da sapere su questa funzione potrebbe essere molto comoda, magari creando una "copia" dell'argomento che si vuole usare e passando quello in modo da "incapsulare" possibili problemi.
Mai quanto la gets(), insomma :D :D :D :D
RaouL_BennetH
03-09-2005, 13:56
Dai alla fine strtok() non è il male :) In quel post che ho fatto dice "Never use these functions" per il fatto che bisogna stare attenti a molte cose durante l'uso di quella funzione. Il maggior problema è che modifica l'argomento, di conseguenza è pericolosa perchè non permette di scegliere al programmatore se passare un parametro "per valore" o " per riferimento", quindi dimenticandosi di questa funzione, da qualche altra parte del programma si potrebbe dichiarare qualcosa che potrebbe portare a dei malfunzionamenti. In ogni caso se si considera tutto ciò che c'è da sapere su questa funzione potrebbe essere molto comoda.
Mai quanto la gets(), insomma :D :D :D :D
Il senso mi è molto chiaro infatti e te ne ringrazio :)
Solo che siccome sono agli inizi,non vorrei prendere l'abitudine di scrivere codice insicuro.Mi sto documentando per vedere come fare in altro modo :)
Il senso mi è molto chiaro infatti e te ne ringrazio :)
Solo che siccome sono agli inizi,non vorrei prendere l'abitudine di scrivere codice insicuro.Mi sto documentando per vedere come fare in altro modo :)
Attenzione che dopo il tuo reply ho aggiunto delle "postille" al mio post. ;)
Secondo me se stai imparando è inutile complicarti la vita con la programmazione "sicura", è meglio che impari tutto quello che c'è da imparare, anche la gets() :sofico:
Poi quando ti senti pronto, cominci a leggere documentazione piu' cazzuta. Altrimenti se cominci a programmare facendoti troppi problemi ti passa la voglia. Secondo me, ovviamente. Poi se la cosa ti affascina e ti riesce senza intoppi non c'è nulla di male, anzi.
RaouL_BennetH
03-09-2005, 14:29
Attenzione che dopo il tuo reply ho aggiunto delle "postille" al mio post. ;)
Secondo me se stai imparando è inutile complicarti la vita con la programmazione "sicura", è meglio che impari tutto quello che c'è da imparare, anche la gets() :sofico:
Poi quando ti senti pronto, cominci a leggere documentazione piu' cazzuta. Altrimenti se cominci a programmare facendoti troppi problemi ti passa la voglia. Secondo me, ovviamente. Poi se la cosa ti affascina e ti riesce senza intoppi non c'è nulla di male, anzi.
No tranquillo, mi affascina.
Della gets() lo sapevo,e difatti ho imparato subito ad usare fgets() al suo posto.
Vorrei fare lo stesso anche per quest'altro problema perchè quando prendo un'abitudine,poi per me è dura abbandonarla.Meglio quindi imho cominciare nella giusta direzione e,aggiungo,sapere anche il perchè alcune funzioni sono da scartare rispetto ad altre. :)
xglobusx
03-09-2005, 22:16
sentite:
dopo aver "preso" preso una stringa dal file con fgets, sscanf non posso usare sscanf perchè non so quante macchine sono elencate nella stringa vero??
Cmq si credo che duplicando la stringa si possa usare strtok per contare gli spazi.
sscanf la puoi usare, basta che tu legga una parola alla volta...
xglobusx
05-09-2005, 11:13
se io faccio un ciclio while per leggere con sscanf cosa metto come condizione per uscire dal ciclo? non capisco se sscanf arrivata all'ultima parola lascia un puntatore a NULL o casa fa
Ti prendi come buffer di sscanf un puntatore alla prima lettera valida...
stringa contiene la stringa da leggere...
char *p = stringa;
do {
sscanf(p, "%s", nuova_parola);
if((p + strlen(nuova_parola) == '\0')
break;
p += strlen(nuova_parola) + 1;
} while(nuova_parola[0] != '\0' || )
Verifica un po' cosa succede se ci sono degli spazi in fondo...
xglobusx
05-09-2005, 11:45
grazie mille, hai ragione! Non avevo pensato a \0
Gli spazi alla fine per ora non ci sono, il file lo scrivo io! Cmq ci penso.. Grazie ancora
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.