PDA

Visualizza la versione completa : [C] alternativa alla funzione scanf


gaten
04-04-2012, 18:57
Ragazzi il professore ci dice in continuazione che la funzione scanf una funzione un p rompi.. poich qualora avessimo una cosa del tipo:



scanf("%d", variabile);


e inseriamo, ciao, si bloccherebbe tutto.

Invece di inserire un input un intero con scanf, quale funzione potrei utilizzare?

torn24
05-04-2012, 12:21
Puoi usare fgets() per leggere tutti gli input come una stringa , e successivamente
analizzare la stringa con sscanf() ,ma occorre sempre che ci sia corrispondenza tra tipo
di variabile e dati inseriti "quindi non ti cambia molto", questo cosa comune ,nella maggior parte dei linguaggi tranne qualche eccezione "vedi php".




char mese[20];
int giorno;
fgets(contenitore,50,stdin) // esempio input : 12 novembre
sscanf(contenitore,"%d %s",&giorno,mese);

gaten
05-04-2012, 12:48
Se usassi fgets e poi utilizzo la funzione atoi ? tipo cos:



/* =============================================
** Function per leggere una stringa di caratteri
** da tastiera
** ---------------------------------------------*/
void InserisciDaTastiera(char *stringa, int Max)
{
int i;

fgets(stringa, Max, stdin);

for ( i=0; stringa[i] < 0 || stringa[i] > 31; i++);
stringa[i]=0;

fflush(stdin);
}


e poi nel main faccio:




char *str;
int var;

InserisciDaTastiera(str, 50);
var = atoi(str);

torn24
05-04-2012, 13:17
presumo che char *str;
nel main gli venga allocata memoria !

puoi controllare con un ciclo istruzioni condizionale se la stringa un numero intero,
e poi convertirla con atoi.

da quello che ho capito dall 'esempio ,quello che vorresti fare , considerare se i primi caratteri sono numeri , e se sono seguiti da altri caratteri mettere
il terminatore stringa ! ma le condizioni del for sono sbagliate .
poi solo un caso di stringa in input "quindi una soluzione limitata";





#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
int i;
int risultato;
char stringa[]="123testo"; //esempio di input come ho capito io
for ( i=0; stringa[i] >=48 && stringa[i]<=57; i++);
stringa[i]=0;
puts(stringa);
risultato=atoi(stringa);
system("PAUSE");
return 0;
}

gaten
05-04-2012, 13:22
No, hai capito male.

Quello che voglio fare semplicemente inserire un intero senza utilizzare scanf.

gaten
05-04-2012, 13:25
Comunque anche giusto controllare se quello che viene inserito e un intero a tutti gli effetti oppure una cosa del tipo: "1e3432".
Controllare se un intero "puro" giusto

gaten
05-04-2012, 13:30
#include <stdio.h>
#include <stdlib.h>

int InsertInteger(char *str, int Max, int Var)

int main()
{
char *str;
int Integer;

printf("Inserisci un valore intero:\n");
Integer=InsertInteger(str, 100, Integer);

printf("Il valore inserito e': %d", Integer);
}

/*=============================
* Inserisco in input un intero
*===========================*/
int InsertInteger(char *str, int Max, int Var)
{
int i;

fgets(str, Max, stdin);

// Qui dovrei controllare se il valore un intero a tutti gli effetti oppure no.
// Se lo lo converto in intero e restituisco
// altrimenti devo chiedere Errato! INserire un valore intero!

Var = atoi(str);

for ( i=0; str[i] < 0 || str[i] > 31; i++);
str[i]=0;

fflush(stdin);

return Var;
}


Ora funziona perfettamente, per se inserisco tipo "ciao", restituisce 0.. invece io vorrei fare in modo che esca a video: "Errore!Inserire correttamente il valore intero".

Rising1
05-04-2012, 13:58
domande:

ma scanf per caso una funzione che restituisce un particolare valore in caso fallisca?
in c/c++ c' per caso try .... except... etc?

gaten
05-04-2012, 14:02
http://www.cplusplus.com/reference/clibrary/cstdio/scanf/

gaten
05-04-2012, 14:04
Nella maggior parte dei casi, per quanto io sappia, si blocca il programma (cosa che non fa mai piacere) anche perch immagina una scimmia davanti al PC con scanf, potrebbe inserire l'impossibile e bloccare programmi infinitamente.
Nota bene che ci sono persone che usano programmi e sono peggio delle scimmie.
Per questo mi st dando da fare nel sostituire scanf con qualcos'altro.

Loading