PDA

Visualizza versione completa : conversione da stringa a intero --> C


NS-1
29-07-2004, 11.29.52
int conta, conta2;
char tempo[5];

printf("\nInserisci Tempo (ms): ");
fgets(tempo, 4, stdin);

for(conta = 0, conta2 = 0; conta <= strlen(tempo) ; conta++){
if(isdigit(tempo[conta]))
conta2++;
}

if(conta2 == strlen(tempo))
Sleep(atoi(tempo));



come si può intuire dal codice, prendo una stringa, vorrei controllare che il dato inserito sia composto solo da numeri e poi và convertito da char in int...

cosa devo cambiare? cosa faccio?

grazie...

LoryOne
29-07-2004, 11.52.36
Nulla. Va bene così.
Le funzioni is... verificano un carattere alla volta.

NS-1
29-07-2004, 12.04.33
:( e perchè lo Sleep lo esegue ma con dei tempi sbagliati? :(

NS-1
29-07-2004, 12.13.20
è fgets() che non quadra...

sostituendolo con il poco sicuro scanf() tutto è ok...
secondo te perchè?

grazie...

LoryOne
29-07-2004, 12.20.58
Esegue perchè compila, visto che sintatticamente è ok.
Ma quello che compila è quello che vuoi ?
Chieditelo sempre.

Prima di tutto guarda tempo come risulta dopo la chiamata a fgets.
Poi guarda cosa restituisce strlen ed infine atoi

NS-1
29-07-2004, 12.25.04
ok. provo a utilizzare il debug..... sperando riuscirci... :)

NS-1
29-07-2004, 12.35.13
:D era fgets() a cui facevo prendere un char in meno.... devo calcolare anche il '\0' quindi?

LoryOne
29-07-2004, 13.10.06
#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <stdlib.h>

main(void){
int conta, conta2;
char tempo[5];

printf("\nInserisci Tempo (ms): ");
fgets(tempo, sizeof(tempo), stdin);
printf("Hai inserito :%s",tempo);
printf("\nLunghezza :%i",strlen(tempo));
printf("\nValore :%i",atoi(tempo));
getch();
}


Inserisci stringhe di caratteri cominciando da lunghezze superiori a quelle impostate dall'array e giudica tu stesso. ;)
Hai capito dove sta il baco ? ;)

NS-1
29-07-2004, 13.43.42
nella dichiarazione del vettore " char tempo[5] " ....

sbaglio? :D

LoryOne
29-07-2004, 14.12.02
Devo far prendere anche a te un pezzo di carta e farti scrivere cosa fa il programma ?

Io spero che nel lasso intercorso tra l'ultimo tuo post e questo tu abbia capito.
Ad ogni modo:
Qual'è la condizione che deve essere verificata affinchè Sleep possa essere eseguita?

il baco sta qua:


if(conta2 == strlen(tempo))
Sleep(atoi(tempo));

NS-1
29-07-2004, 14.37.20
la stringa massima deve essere di 5 caratteri che poi convertendola diventerà al massimo 99999, quindi dichiaro un array char tempo[6] che immagazzinerà la mia stringa massima e il carattere di terminazione '\0'...( 99999 + '\0')

basandomi su: for(conta = 0, conta2 = 0; conta <= strlen(tempo) ; conta++)
controllo che sia un numero e se lo è aumento la mia count2....

quindi se tutti caratteri sono numeri, conta2 sarà uguale a strlen(tempo)

o no?

LoryOne
29-07-2004, 14.46.04
1) Prendi carta e penna.
.
.
.
.
.
.
.

2) FAI TESTAMENTO
.
.
.
.
.
.

3) (W) (W) (W) (W)

Quanto valgono strlen() e conta2 a fine ciclo ?

4) Resuscita
5) Loop

:D

Edito per essere più chiaro:
Il problema sorge se la stringa < sizeof(stringa)
ergo PORCHERIA DI CODICE.

NS-1
29-07-2004, 14.51.55
:(

LoryOne
29-07-2004, 14.55.16
La Microsoft ti aspetta :D

Non voglio ergermi a giudice supremo o fare il "so tutto io" perchè gli errori li faccio anch'io e tanti.
Solo cerchiamo di fare più attenzione, anche se il codice è banale.

NS-1
29-07-2004, 14.57.09
avevo aggiunto questo:

if(isdigit(tempo[conta]) || isspace(tempo[conta]))
conta2++;

è tanto male come soluzione?

LoryOne
29-07-2004, 14.58.47
Aggiungerei solo una cosa NS-1.
Io sono resuscitato 1.000.000 di volte ;)

NS-1
29-07-2004, 15.02.00
sono qui per imparare... anche grazie a te... :D

quell'aggiunta ("isspace()") è una soluzione schifosa?
hai in mente qualcosa di meglio?

NS-1
29-07-2004, 15.17.58
ho un'altro problemino, con le stringhe minori di sizeof(stringa) è tutto ok, visto che però sono all'interno di un while e all'inizio di questo c'è un stringa = getch(), quando scrivo una stringa lunga più di sizeof(stringa) ha già intercettato le cifre messe in più nel ciclo precedente...
come posso scartarle?

grazie...