Scanf linguaggio c

luca981
ciao a tutti .
scusate le mie imprecisazioni !
vorrei sapere che istruzzione mi conviene usare per "dividere" una variabile char
tipo: la mamma ha fatto 7 chili di pasta

in piu variabili parole .

variabile la
variabile1 mamma
variabile2 ha
variabile3 fatto
variabile4 7
ecc...

scanf funziona solo con lo standard input .
grazzie

Risposte
enigmagame
Non ho ben capito quello che vuoi fare. Tu passi quella frase in input e vuoi che il programma memorizzi ogni parola che compone la frase in una variabile diversa?

simo_83
Non ho ben capito neanche io. Se hai in input una stringa ( un char * ) in C devi semplicemente scorrerla e ogni volta che trovi uno spazio bianco memorizzare la parola. Magari creati un'area temporanea che svuoti e riempi ad ogni passaggio.

luca981
si. esattamente !
io passo una frase input di non piu di 5 parole .
e voglio che il programma memorizzi ongni parola che compone la frase in una variabile diversa .

vict85
"luca98":
si. esattamente !
io passo una frase input di non piu di 5 parole .
e voglio che il programma memorizzi ongni parola che compone la frase in una variabile diversa .


Dopo che l'hai messa in un array di char (se preferisci puoi chiamarla stringa), lo scorri carattere per carattere e memorizzi il carattere nella variabile desiderata. ogni volta che trovi uno spazio ' ' o un '\n' o un '\t' metti il terminatore di stringa e cambi variabile (attento agli spazi multipli però)... Quanto trovi la fine della stringa metti il terminatore di stringa nell'ultima variabile.

luca981
>Dopo che l'hai messa in un array di char (se preferisci puoi chiamarla stringa), lo scorri carattere per carattere e memorizzi il carattere nella >variabile desiderata. ogni volta che trovi uno spazio ' ' o un '\n' o un '\t' metti il terminatore di stringa e cambi variabile (attento agli spazi >multipli però)... Quanto trovi la fine della stringa metti il terminatore di stringa nell'ultima variabile.

si ok ho capito .
ma che istruzzioni mi conviene usare ?
quali istruzioni mi conviene studiare ?
per farlo ?

Il_Conte_Pasticcere
"luca98":
ciao a tutti .
scusate le mie imprecisazioni !
vorrei sapere che istruzzione mi conviene usare per "dividere" una variabile char
tipo: la mamma ha fatto 7 chili di pasta

in piu variabili parole .

variabile la
variabile1 mamma
variabile2 ha
variabile3 fatto
variabile4 7
ecc...

Dunque - "una variabile char" è un carattere. Quello che intendi tu è una variabile STRINGA ovvero VETTORE di char.

Non "char" ma "char *" o "char []"

Al tuo problema ci sono almeno 2 soluzioni:
1) fai "a mano" come ti hanno consigliato le altre persone nel thread, con un puntatore che scorre la tua frase e (numero parole) stringhe vuote per memorizzare le singole parola quando trovi un carattere " ". Nota che questa è la soluzione migliore, perchè la gestisci come vuoi essendo tu a scriverla. Inoltre ti da la possibilità di impratichirti meglio con il linguaggio.
2) usi la funzione di libreria "strtok()" contenuta in string.h. Questa funzione divide in token una stringa con chiamate successive - il che è esattamente quello che vuoi fare tu. Il prototipo è questo:

char *strtok(char *str, char *delim);

come vedi prende in input 2 stringhe e ne ritorna un'altra. Molto brevemente, si usa così:
la *prima* chiamata la fai con la stringa che vuoi spezzare come primo argomento e con la stringa che vuoi usare come delimiter (nel tuo caso, il solo carattere "spazio"). strtok() ritorna il primo token. Poi, ogni chiamata successiva la farai con NULL come primo argomento e il delimiter come secondo. Ad ogni chiamata, strtok() ritornerà un token della stringa, e NULL quando la frase è finita.
Un piccolo esempio estemporaneo:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(int argc, char **argv) {
	char frase[] = "La mamma ha fatto 7 chili di pasta";
	char *parola;
	
	// 1a chiamata, diamo a strtok la frase
	parola = strtok(frase, " ");
	fprintf(stdout, "%s\n", parola);
	
	// chiamate successive, finchè parola non vale null, chiamiamo strtok con NULL
	while((parola = strtok(NULL, " ")) != NULL) {
		fprintf(stdout, "%s\n", parola);
	}
	
	exit(EXIT_SUCCESS);
}

Ovviamente nell'esempio gli faccio stampare i token, tu da quanto ho capito li devi copiare in altre variabili di tipo stringa (lo puoi fare facilmente con sprintf() - leggi il manuale). Ultimo dettaglio su strtok() - molti programmatori più esperti preferiscono evitarla, perchè non è coerente nelle sue varie implementazioni per quello che riguarda la gestione interna della memoria che ospita la stringa - ma a te questo interessa relativamente, il tuo lavoro mi pare un esercizio e non un progetto complesso.

"luca98":

scanf funziona solo con lo standard input .
grazzie

Non è vero - scanf è un alias di fscanf(stdin, ...) che funziona con qualunque stream. Addirittura c'è sscanf() che parsa stringhe da altre stringhe. Ti consiglio di leggere il manuale di queste funzioni.

Ciao, Fabio.

luca981
ciao , grazie .
era proprio quello che stavo cercando .

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.