[C] Salvare stringe in un unico vettore

floppyes
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:
	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
Obidream
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.
#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;
}

floppyes
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:
	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!

vict85
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.

floppyes
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!

vict85
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.

floppyes
Ciao!

Grazie mille per l'ottima spiegazione :)

Ora è tutto chiaro :)

Grazie ancora
Ciaoo :)

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