[C] Salvare stringe in un unico vettore
Ciao a tutti!
Vorrei chiedervi un aiuto sul seguente esercizio di programmazione in C. Devo risolvere il seguente problema:
Testo:
L'utente deve salvare 5 impegni diversi. Ogni impegno è digitato nella seguente forma: giorno - impegno, ad esempio:
10 Visita dentista.
Scrivere un programma in c in grado di memorizzare 5 impegni. Inseriti i 5 impegni l'utente dovrà digitare il giorno e il programma dovrà mostrare l'impegno per quel giorno.
Ad esempio:
Utente digita: 10
Programma visualizza: Visita dentista.
Io ho pensato di realizzarlo in questo modo: creare un vettore generico che contenga il giorno e l'impegno, poi utilizzare la funzione strncpy per copiare il giorno in un vettore, e l'impegno in un altro vettore.
L'utente inserisce quindi il giorno e il programma cerca all'interno del primo vettore se c'è corrispondenza con uno dei giorni inseriti, ed in caso stampa la descrizione dell'impegno.
Quello che non riesco a fare è come salvare più stringhe in un unico vettore.
Ad esempio se voglio salvare più numeri in un vettore, utilizzo un ciclo for:
Ma se voglio memorizzare una stringa di caratteri come posso fare?
Volendo potevo utilizzare la funzione fgets, però come faccio a salvare in un unico vettore le varie stringhe? Inoltre come posso dire alla funzione strncpy di copiare dalla terza posizione in poi?
Grazie mille
Ciaoo
Vorrei chiedervi un aiuto sul seguente esercizio di programmazione in C. Devo risolvere il seguente problema:
Testo:
L'utente deve salvare 5 impegni diversi. Ogni impegno è digitato nella seguente forma: giorno - impegno, ad esempio:
10 Visita dentista.
Scrivere un programma in c in grado di memorizzare 5 impegni. Inseriti i 5 impegni l'utente dovrà digitare il giorno e il programma dovrà mostrare l'impegno per quel giorno.
Ad esempio:
Utente digita: 10
Programma visualizza: Visita dentista.
Io ho pensato di realizzarlo in questo modo: creare un vettore generico che contenga il giorno e l'impegno, poi utilizzare la funzione strncpy per copiare il giorno in un vettore, e l'impegno in un altro vettore.
L'utente inserisce quindi il giorno e il programma cerca all'interno del primo vettore se c'è corrispondenza con uno dei giorni inseriti, ed in caso stampa la descrizione dell'impegno.
Quello che non riesco a fare è come salvare più stringhe in un unico vettore.
Ad esempio se voglio salvare più numeri in un vettore, utilizzo un ciclo for:
for (i=0;i<3;i++) { scanf("%d", &n); v[i]=n; }
Ma se voglio memorizzare una stringa di caratteri come posso fare?
Volendo potevo utilizzare la funzione fgets, però come faccio a salvare in un unico vettore le varie stringhe? Inoltre come posso dire alla funzione strncpy di copiare dalla terza posizione in poi?
Grazie mille
Ciaoo

Risposte
Mmh non mi pare la soluzione più semplice la tua...
Io utilizzerei una struttura contenente appunto un intero per il giorno e una stringa per l'attività corrispondente, così a quel punto l'esercizio diventerebbe estremamente semplice...
Io farei così ( andrebbe perfezionato in alcune cose, ma è giusto per spiegare meglio ciò che intendo), ma alternativamente potresti usare un vettore di interi e un vettore di stringhe, allineati in modo che giorni e attività corrispondano.
Io utilizzerei una struttura contenente appunto un intero per il giorno e una stringa per l'attività corrispondente, così a quel punto l'esercizio diventerebbe estremamente semplice...
Io farei così ( andrebbe perfezionato in alcune cose, ma è giusto per spiegare meglio ciò che intendo), ma alternativamente potresti usare un vettore di interi e un vettore di stringhe, allineati in modo che giorni e attività corrispondano.
#include <stdio.h> #include <stdlib.h> #define N 5 #define MAX_STR 22 typedef struct { int giorno; char string[MAX_STR]; } my_struct; int main() { my_struct impegni[N]; int i,giorno; printf("Inserisci il giorno e l'attivita':\n"); for(i=0;i<N;i++) { scanf("%d",&impegni[i].giorno); fgets(impegni[i].string,MAX_STR,stdin); } printf("Digita il giorno:\n"); scanf("%d",&giorno); printf("Ecco le attivita' corrispondenti al giorno %d\n",giorno); for(i=0;i<N;i++) if(giorno==impegni[i].giorno) printf("%d %s",impegni[i].giorno,impegni[i].string); return 0; }
Ciao!
Grazie mille per la spiegazione. Effettivamente utilizzare la struttura è molto più semplice ed efficace!
Solo una cosa non mi è chiara, il primo ciclo for:
In pratica con lo scanf viene salvato nella variabile giorno solamente il numero inserito, mentre con la fgets salvo solamente l'impegno. Questa divisione in "automatico" è possibile perchè ho dichiarato la variabile giorno come intero, e quindi vengono salvati solamente i numeri giusto?
Grazie mille
Ciaoo!
Grazie mille per la spiegazione. Effettivamente utilizzare la struttura è molto più semplice ed efficace!
Solo una cosa non mi è chiara, il primo ciclo for:
for(i=0;i<N;i++) { scanf("%d",&tutti_impegni[i].giorno); fgets(tutti_impegni[i].evento,DIM1,stdin); }
In pratica con lo scanf viene salvato nella variabile giorno solamente il numero inserito, mentre con la fgets salvo solamente l'impegno. Questa divisione in "automatico" è possibile perchè ho dichiarato la variabile giorno come intero, e quindi vengono salvati solamente i numeri giusto?
Grazie mille
Ciaoo!
In realtà è il %d a dire a scanf che la variabile è un intero. Tu puoi anche mettere una variabile del tipo sbagliato. Immagino tu possa avere un warning ma non è detto.
Ciao!
Grazie per la risposta. Ma allora come mai che con la fgets non viene salvato anche il numero?
In pratica io inizio a scrivere, lo scanf salva i numeri e poi appena inizio a scrivere la frase (quindi i caratteri) la scanf non salva più nulla ma il resto viene salvato dalla fgets?
Grazie
Ciaoo!
Grazie per la risposta. Ma allora come mai che con la fgets non viene salvato anche il numero?
In pratica io inizio a scrivere, lo scanf salva i numeri e poi appena inizio a scrivere la frase (quindi i caratteri) la scanf non salva più nulla ma il resto viene salvato dalla fgets?
Grazie

Ciaoo!
Perché scanf è fatto apposta per convertire stringhe in altro, mentre fgets salva una stringa di caratteri. Per intenderci se tu scrivi sulla console 10 allora stai inserendo il carattere 1 seguito dal carattere 0. Se tu usi scanf quello che fa è qualcosa di questo tipo:
1) interpretare la stringa "%d";
2) leggere i caratteri 1 e 0 e assicurarsi che siano del tipo giusto (eventualmente ignorare ciò che non va);
3) convertire la stringa "10" nel numero 10 (o meglio nel numero binario 1010 )
4) memorizzare il valore nell'indirizzo fornito dall'utente.
fgets invece copia semplicemente quello che hai inserito nella console all'interno della variabile stringa (finché non viene raggiunto un a capo o non si inseriscono DIM1-1 caratteri). Finita la copia inserisce il terminatore di stringa.
1) interpretare la stringa "%d";
2) leggere i caratteri 1 e 0 e assicurarsi che siano del tipo giusto (eventualmente ignorare ciò che non va);
3) convertire la stringa "10" nel numero 10 (o meglio nel numero binario 1010 )
4) memorizzare il valore nell'indirizzo fornito dall'utente.
fgets invece copia semplicemente quello che hai inserito nella console all'interno della variabile stringa (finché non viene raggiunto un a capo o non si inseriscono DIM1-1 caratteri). Finita la copia inserisce il terminatore di stringa.
Ciao!
Grazie mille per l'ottima spiegazione
Ora è tutto chiaro
Grazie ancora
Ciaoo
Grazie mille per l'ottima spiegazione

Ora è tutto chiaro

Grazie ancora
Ciaoo
