Input controllato (utilizzo backspace)

di il
13 risposte

Input controllato (utilizzo backspace)

Buonasera. Dovrei modificare questo programma controllando l’input anche con il backspace. Ho provato a farlo mettendo una condizione sull’input che appena si digita il backspace su tastiera si fa una stampa del puntatore che va indietro di uno, sovrascrive con uno spazio e si sposta nuovamente di uno come notate nel codice quando faccio: cout<<(“/b /b”)
Il problema è che fa soltanto in parte cio che richiedo, perche non mi elimina effettivamente il carattere dalla memoria ( ma nella stampa a video sembra eliminarlo) Infatti poi quando mi viene stampato il numero letto viene riportato anche quello che ho eliminato con il backspace... sapere aiutarmi? Vi lascio qui il codice
[CODE] #include <iostream> #include <conio.h> #include <string> using namespace std; void leggi(string outstr,int& dato,char& car, bool crlf); // main() { int datoin; char car; leggi("inserisci un numero intero -> ",datoin,car,true); cout << "numero letto -> " << datoin; } void leggi(string outstr, int& num, char& car, bool crlf_flag) { cout << outstr; num=0; do { car=getch(); if (car>='0' and car<='9' ) { //sono accettati numeri da 0 a 9 putch(car); num=num*10+car-48; } else if (car==8) cout<< "\b \b"; } while (car!=13 and car!=27); // 13==invio 27==esc if (crlf_flag and car==13) { putch(car); putch(10); } }

13 Risposte

  • Re: Input controllato (utilizzo backspace)

    Scusate se il codice è un indentato male ma l’ho dovuto capire e incollare dall’email, spero capiate comunque
  • Re: Input controllato (utilizzo backspace)

    E dobbiamo indentarlo noi? Dopo averlo copiato non potevi sistemarlo prima di proporlo?

    Io non capisco ...

    Comunque, se hai inserito un carattere che prendi in considerazione con

    num=num*10+car-48;

    è ovvio che, se lo cancelli dal video, devi fare l'operazione che lo toglie da num ... pensaci
  • Re: Input controllato (utilizzo backspace)

    Si ci avevo pensato, ma non ho trovato la soluzione per levare da num soltanto i valori o il valore ( in caso fosse uno solo) cancellato/i
  • Re: Input controllato (utilizzo backspace)

    Dovrai usare un buffer di input in cui conserverai i vari caratteri man mano che si presentano. Potrai eliminare facilmente l'ultimo "a destra" se lo cancelli. Alla fine dell'input farai la conversione dalla stringa nel valore numerico corrispondente.
  • Re: Input controllato (utilizzo backspace)

    Per buffer di input intendi un array?
  • Re: Input controllato (utilizzo backspace)

    Sì...
  • Re: Input controllato (utilizzo backspace)

    Dopo aver verificato che il carattere immesso è un numero, prima di fare il calcolo su num per ottenere il totale immesso, devi conservarlo in una variabile es: ultimo=num; , per fare in modo che al prossimo carattere immesso, se si tratterà di un backspace, hai l'ultimo num calcolato e sei in grado di ripristinarlo: num=ultimo.

    Valido per un backspace, se vuoi gestire più backspace, puoi memorizzare i valori di num in un array

    EDIT:
    Il primo approcio semplificato, ti sarà utile per comprendere il meccanismo.
  • Re: Input controllato (utilizzo backspace)

    Rubik ha scritto:


    ....puoi memorizzare i valori di num in un array
    Che è la soluzione corretta e completa (che gli avevo suggerito). Perché confondergli le idee?

    Non deve memorizzare num nell'array ma i caratteri e fare il calcolo alla fine dell'input. Semplice e lineare.
  • Re: Input controllato (utilizzo backspace)

    Grazie mille ora provo
  • Re: Input controllato (utilizzo backspace)

    L’unica cosa che mi chiedo è: mettendo tutti i caratteri in un array, come faccio a sostituire i nuovi caratteri (immessi dopo il backspace) con quelli vecchi? Perché facendo la somma dei caratteri ottenuti prima con quelli ottenuti dopo ( che poi convertirò in interi) non credo sia il risultato corretto, perché i caratteri immessi prima del backspace dovrei proprio levarli dalla memoria...
  • Re: Input controllato (utilizzo backspace)

    Ad esempio se al primo input inserisco
    1567
    Poi faccio due backspace e voglio lasciare soltanto 15. Facendo il calcolo tra i due il valore ottenuto non è corretto. Dovrebbe proprio eliminarmi in questo caso (67) dalla memoria...o sbaglio?
  • Re: Input controllato (utilizzo backspace)

    Quando c'è il backspace scrivi '\0' nell'indice corrente dell'array, dopodiché se l'indice stesso è maggiore di zero sottrai 1 dall'indice, come ti è stato detto
  • Re: Input controllato (utilizzo backspace)

    Avevo già postato un codice per controllare l'input, non è come il tuo, ci puoi solo prendere qualche spunto, non è nenche un buon esempio di programmazione, visto che c'è un goto e sono già stato bacchettato per averlo usato in questo codice, l'unica diversità che c'è da quello già postato sta nel fatto che questo gestisce anche i numeri negativi.
    
    #include <iostream>
    #include <conio.h>
    
    using namespace std;
    
    int InputNumerico(){
    
        unsigned char _ascii=0;
        int _cifra=0;
        int _negativo=1;
        unsigned int _indice=0;
        int _sequenza[255]={0};
    next:
        do{
                _ascii=getch(); // lettura tastiera
                if (_ascii==27){cout<<endl; exit(0);} // esc
                if (_ascii==8){ // backspace
                    if (_indice<1){
                            if (_negativo==-1) cout<<"\b \b";
                            _cifra=0;_negativo=1;
                    }
                    else{
                            _cifra=(_cifra-_sequenza[--_indice])/10;cout<<"\b \b";
                    }
                }
                if (_cifra==0 && _ascii==45){ // meno
                    _negativo=-1;
                    cout<<"-";
                }
        }while ((_ascii<'0' || _ascii>'9') && _ascii!=13 );
    
        if (_ascii==13){ // invio
            return _cifra * _negativo; // ritorno risultato
        }
        else{
            _sequenza[_indice]=_ascii-'0';
            _indice++;
            cout<<_ascii - '0'; // visualizzazione tasto premuto
            _cifra = (_cifra * 10) + (_ascii - '0'); // calcolo del risultato
            goto next;
        }
    }
    
    int main(){
        cout << "Input numerico ";
        int res = InputNumerico();
        cout<<endl<<endl<<"Accettato "<<res<<endl;
    
        return 0;
    }
    
Devi accedere o registrarti per scrivere nel forum
13 risposte