PDA

Visualizza la versione completa : Stringhe in C


forzagaeta
05-11-2009, 10:25
Ciao a tutti , sto cercando di imparare il C , premetto che conosco già qualche altro linguaggio di programmazione , ma non capisco perchè ho delle notevoli difficoltà a fare le cose basilari.
Spiego meglio il mio problema:

devo scrivere un programma che legge due date nel formato g/m/a , le confronta e ritorni una stringa del tipo : la prima data è maggiore della seconda .

sulla logica del programma non ho nessun problema mi servirebbe un aiuto su come gestire le stringhe :

per esempio io leggo da input con lo scanf la data , una volta memorizzata vorrei fare una sorta di split sul carattere '/' e memorizzare i tre valori in tre variabili distinte oppure prendere i primi due valori e caricarli in una variabile, gli altri due caricarli in una seconda e gli ultimi in una terza.

Mi date una mano per favore? Grazie a tutti .

YuYevon
05-11-2009, 11:11
Per estrarre i singoli campi della data puoi ricorrere alla funzione strtok()

http://www.cplusplus.com/reference/clibrary/cstring/strtok/

ti basterà riadattare il codice proposto come esempio, solo che come delimitatore dovrai impostare soltanto '/'.

Per convertire le sottostringhe così ottenute in numeri, puoi ricorrere ad atoi() o a sscanf()

http://www.cplusplus.com/reference/clibrary/cstdlib/atoi/
http://www.cplusplus.com/reference/clibrary/cstdio/sscanf/

forzagaeta
05-11-2009, 11:55
Grazie per la risposta .

Allora sto cerando di riadattare l'esempio al mio caso e sono riuscito a fare lo split.

#include <stdio.h>
#include <string.h>

char str[10];

int main ()
{

scanf("%s",&str);
printf ("ho inserito ---> %s",str);

char * pch;
printf ("Splitting string \"%s\" into tokens:\n",str);
pch = strtok (str,"/");
while (pch != NULL)
{
printf ("%s\n",pch);
pch = strtok (NULL, "/");
}

system("PAUSE");
return 0;
}


Ho un altra domanda da fare (cerca di capire ma sono alle prime armi)

invece di leggere i valori in questo modo

while (pch != NULL)
{
printf ("%s\n",pch);
pch = strtok (NULL, "/");
}

io vorrei prenderli singolarmente senza fare il while.

come posso leggere il puntatore?

ho provato a fare una cosa di questo tipo

gg = pch[0];
mm = pch[1];
aa = pch[2];

ma credo che sia sbagliato.

Grazie

YuYevon
05-11-2009, 12:09
Originariamente inviato da forzagaeta
invece di leggere i valori in questo modo
...
io vorrei prenderli singolarmente senza fare il while.


Sicuro di averne bisogno?

In ogni caso basta "srotolare" il ciclo while:



pch = strtok (str,"/");
printf ("%s\n",pch);
pch = strtok (NULL, "/");
printf ("%s\n",pch);
pch = strtok (NULL, "/");
printf ("%s\n",pch);


però fai attenzione perché in questo caso non fai alcun controllo su pch (che invece col ciclo while facevi in automatico nella sua condizione), quindi se per caso sbagliassi ad immettere la data, ad esempio nel formato g\m\a anziché g/m/a otterresti un errore run time in quanto una delle strtotk potrebbe restituire NULL come risultato e avresti il crash sulla printf() successiva. Altrimenti dovresti metterci dei controlli if tra le varie strtotk() ma questo renderebbe il tutto poco bello da vedersi, quindi per questo chiediti se ne hai davvero bisogno.
In ogni caso, se hai la certezza che ogni data sarà sempre nel formato g/m/a, allora non avrai bisogno di alcun controllo, o al massimo potresti farne uno solo prima di ricorrere alla strtotk() appunto per verificare se la data sia stata inserita nel formato corretto: se non lo risultasse, gestiresti l'errore in qualche modo.

forzagaeta
05-11-2009, 12:30
Hai ragione forse non ne avevo bisogno, ad ogni modo ho imparato una cosa nuova.

Grazie

Loading