PDA

View Full Version : [C] Riconoscere se un input è una striga o un intero


khelidan1980
13-07-2008, 16:35
premetto il mio programma deve avere un input così:

e piastra

e codifica l'azione di eliminazione e piastra può essere il nome di una piastra da cancellare oppure un numero,un altezza,ovvero:

con

e gamma

elimino la piastra gamma con

e 2

elimino tutte le piastre con altezza due

la e la prendo da input con un getchar() mentre per le stringhe utilizzo questa funzione:

char *leggi_stringa(void)
{
char c;
char *word = calloc(30, sizeof(char)); /* alloca memoria per una stringa di 30 */
/* caratteri */
int i = 0;
while(isspace(c = getchar()));
do
{
if (i >= 30){
word = realloc(word, (i+1)*sizeof(char));
} /*realloca se lo spazio non basta*/
word[i++] = c;

} while (!(isspace(c = getchar())));
word[i] = '\0'; /* chiude la stringa letta */
return word;
}


ora qualcuno sa dirmi una volta che leggi_stringa mi ha ritornato un array di char come faccio per distinguere se quella stringa è effettivamente una stringa oppure e un numero da considerarsi un int?

P.s: non posso fare una cosa così: e 2 d gamma,ovvero per codificare l'azione di elimina devo sempre usare la e

71104
13-07-2008, 16:38
non ho capito un cavolo :asd:
sembra un post scritto estraendo a caso parole e spezzoni di frasi :rotfl:

cosa sarebbe "e piastra", "e gamma", "e 2", "elimina di qua", "elimina di là"... ? :D

khelidan1980
13-07-2008, 16:41
quello è soltanto un esempio di cosa devo avere in input,cmq le piastre sono dei rettangoli su un piano cartesiano,e hanno un altezza definita da quanti altri rettangoli vanno a coprire,a sovrapporsi,sono delle struct mantenute tramite un albero rb,ma il problema è molto prima,fai conto che al mio prompt inserisco 'e nome' oppure 'e 1'

la prima 'e' in input la prendo con un getchar dopo chiamo leggi_stringa che mi ritorna una stringa,mi chiedevo se c'è un modo di capire se quella stringa è in realtà un intero,un numero

71104
13-07-2008, 17:50
la prima 'e' in input la prendo con un getchar dopo chiamo leggi_stringa che mi ritorna una stringa,mi chiedevo se c'è un modo di capire se quella stringa è in realtà un intero,un numero be', la scanf se non riesce a parsare nessun argomento restituisce 0, quindi chiamala provando a parsare un intero (format string "%d"), e se restituisce 0 allora vacci di "%s".

PS: ma ora, scusa, perché un rettangolo su un piano cartesiano si deve chiamare "piastra", asd? :asd:
"rettangolo" non va più bene? come "handicappato" e "negro", che al giorno d'oggi sono stati sostituiti rispettivamente da "differentemente abile" e "di colore"? :D

khelidan1980
13-07-2008, 17:58
be', la scanf se non riesce a parsare nessun argomento restituisce 0, quindi chiamala provando a parsare un intero (format string "%d"), e se restituisce 0 allora vacci di "%s".

PS: ma ora, scusa, perché un rettangolo su un piano cartesiano si deve chiamare "piastra", asd? :asd:
"rettangolo" non va più bene? come "handicappato" e "negro", che al giorno d'oggi sono stati sostituiti rispettivamente da "differentemente abile" e "di colore"? :D

mii come sei preciso preciso!!!:asd: :D

P.s:cmq grazie alla a quel metodo con la scanf non avevo pensato!

Vincenzo1968
13-07-2008, 18:15
...
ora qualcuno sa dirmi una volta che leggi_stringa mi ha ritornato un array di char come faccio per distinguere se quella stringa è effettivamente una stringa oppure e un numero da considerarsi un int?

P.s: non posso fare una cosa così: e 2 d gamma,ovvero per codificare l'azione di elimina devo sempre usare la e

Puoi usare un automa a stati finiti(praticamente, è la stessa tecnica che utilizzano i compilatori).

Nel mio sito puoi scaricare un esempio:

http://www.guidealgoritmi.it/ShowArticle.aspx?ID=6

Nell'articolo l'automa riconosce anche i numeri in virgola mobile. Per assicurarti che la stringa contenga un intero, devi verificare che lo stato ritornato dall'automa sia uguale a S2.

:)