Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 13
  1. #1
    Utente di HTML.it L'avatar di gaten
    Registrato dal
    Jul 2007
    Messaggi
    1,269

    [C] alternativa alla funzione scanf

    Ragazzi il professore ci dice in continuazione che la funzione scanf è una funzione un pò rompi.. poichè qualora avessimo una cosa del tipo:

    codice:
    scanf("%d", variabile);
    e inseriamo, ciao, si bloccherebbe tutto.

    Invece di inserire un input un intero con scanf, quale funzione potrei utilizzare?
    Con i sogni possiamo conoscere il futuro...

  2. #2
    Utente di HTML.it L'avatar di torn24
    Registrato dal
    Aug 2008
    Messaggi
    551

    ciao

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


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

  3. #3
    Utente di HTML.it L'avatar di gaten
    Registrato dal
    Jul 2007
    Messaggi
    1,269
    Se usassi fgets e poi utilizzo la funzione atoi ? tipo così:

    codice:
    /* =============================================
    ** 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:

    codice:
    char *str;
    int var;
    
    InserisciDaTastiera(str, 50);
    var = atoi(str);
    Con i sogni possiamo conoscere il futuro...

  4. #4
    Utente di HTML.it L'avatar di torn24
    Registrato dal
    Aug 2008
    Messaggi
    551

    ciao

    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";


    codice:
    #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;
    }
    Tecnologia

  5. #5
    Utente di HTML.it L'avatar di gaten
    Registrato dal
    Jul 2007
    Messaggi
    1,269
    No, hai capito male.

    Quello che voglio fare è semplicemente inserire un intero senza utilizzare scanf.
    Con i sogni possiamo conoscere il futuro...

  6. #6
    Utente di HTML.it L'avatar di gaten
    Registrato dal
    Jul 2007
    Messaggi
    1,269
    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
    Con i sogni possiamo conoscere il futuro...

  7. #7
    Utente di HTML.it L'avatar di gaten
    Registrato dal
    Jul 2007
    Messaggi
    1,269
    codice:
    #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".
    Con i sogni possiamo conoscere il futuro...

  8. #8
    Utente di HTML.it
    Registrato dal
    Feb 2011
    Messaggi
    156
    domande:

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

  9. #9
    Utente di HTML.it L'avatar di gaten
    Registrato dal
    Jul 2007
    Messaggi
    1,269
    Con i sogni possiamo conoscere il futuro...

  10. #10
    Utente di HTML.it L'avatar di gaten
    Registrato dal
    Jul 2007
    Messaggi
    1,269
    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.
    Con i sogni possiamo conoscere il futuro...

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.