+ Rispondi al messaggio
Pagina 1 di 2 12 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 15

[C/C++] Come prendere del testo in input senza dover digitare il carattere invio

  1. #1
    osharko non è in linea Novello
    Salve,
    Stavo sviluppando un programma nel quale mi serviva poter utilizzare una funziona che prelevasse i caratteri direttamente dal buffer senza quindi necessitare di dover premere invio.
    Della serie:
    prendo in input 20 caratteri, una volta arrivato al ventesimo stoppo l'input senza che l'utente debba digitare invio...
    c'è un modo per poter fare ciò?
    grazie in anticipo



    Ho provato implementando questa funzione:
    char leggi()
    {
    char C;

    __asm{
    MOV AH, 07h
    INT 21h
    MOV [C],DL
    } ;
    return C;
    };

    Fa lettura senza echo di un carattere e poi lo ritorna al chiamante.. il problema è che una volta che il programma sia avvia ed esegue il codice ASM si arresta generando quest'errore:
    "Eccezione non gestita a 0x77cf15de in crittografia.exe: 0xC0000005: Violazione di accesso nella lettura del percorso 0xffffffff."
    Ultima modifica di osharko; 18-01-2013 15:56 

  2. #2
    Non hai specificato dati essenziali, come l'ambiente di lavoro e il compilatore. Il ricorso all'interrupt software DOS in ambienti windows recenti è ovviamente del tutto fuori discussione: ha senso solamente in ambienti legacy, eventualmente entro una virtual machine apposita.


    Quel che occorre è, banalmente, la funzione standard getchar() oppure, se il compilatore lo supporta, il ricorso alle comode e potenti funzioni di conio.h (Borland, Digital Mars e OpenWatcom supportano ampiamente tale estensione).
    ℹ️ Leggi di più su M.A.W. 1968 ...

  3. #3
    osharko non è in linea Novello
    Ambiente lavoro: Visual studio 2010
    Compilatore: quello di default di Visual Studio
    Ambiente legacy???

    Comunque getchar l'avevo già provato, ma necessita di INVIO, quindi non va bene per quello di cui necessito

  4. #4
    Quale sarebbe il problema? Limitare l'input ad una lunghezza arbitraria? Bloccare l'input utente al carattere i-esimo? Eliminare il carriage return?

    Con qualche distinguo, per ottenere tutto ciò è necessario e sufficiente usare banalmente fgets().

        #define MAX_SIZE 32
        ...
        char name[MAX_SIZE];
        ...
        fgets(name, MAX_SIZE, stdin);
        {
            char *p;
            p = strchr(name, '\n');
            if (NULL != p) 
            {
                *p = '\0';
            }
        }
    
    La fgets(), funzione inerentemente robusta, accetterà al massimo MAX_SIZE -1 caratteri dall'input e aggiungerà il necessario terminatore di stringa.
    ℹ️ Leggi di più su M.A.W. 1968 ...

  5. #5
    osharko non è in linea Novello
    Volevo che in maniera silente arrivato a 16 caratteri letti, si attivasse una funzione.
    Ma la cosa più importante è che volevo che si potesse prendere in input, e digitando un carattere si potesse uscire.
    (Sono cose che facevo in asm, per questo volevo usare l asm perché sono algoritmi che gia conosco a differenza del tuo di cui poco riesco a capire... anche se però ti ringrazio comunque )

  6. #6
    Sono cose che anche il sottoscritto ha sempre fatto e continua a fare in Assembly, da più di trent'anni. Ma su piattaforme ben diverse dai PC, ormai.

    Risulta infatti molto cambiato il modo in cui in linguaggio C si possono fare lavori non-portabili negli ambienti "moderni". Il supporto in emulazione ai sani vecchi interrupt DOS è molto limitato: per lavorare davvero al low level occorre richiamare direttamente le API di Windows, o appoggiarsi a librerie varie per l'I/O su console, tra le quali la già citata conio creata da Borland. E qui il cerchio si chiude.

    Se vuoi restare nello standard, leggi un carattere per volta usando fgetc().
    ℹ️ Leggi di più su M.A.W. 1968 ...

  7. #7
    osharko non è in linea Novello
    Ok grazie mille, appena arrivo a casa provo.
    Per caso conosci qualche sito tutorial buono per imparare le api di windows?
    E grazie ancora per il tuo validissimo aiuto

  8. #8
    MSDN Windows API List, ovviamente.
    ℹ️ Leggi di più su M.A.W. 1968 ...

  9. #9
    osharko non è in linea Novello
    effettivamente, essendo di windows dovevano per forza stare sul sito della Microsoft
    Comunque la funzione fgetc() che parametri vuole?
    cioè se faccio

    value[i]=fgetc();
    
    il compilatore mi da quest'errore:

    error C2661: 'fgetc': nessuna funzione in overload accetta 0 argomenti

  10. #10
    Altrettanto ovviamente, dovrai spiegare a fgetc() di prelevare il prossimo carattere disponibile nel buffer di stdin.
    ℹ️ Leggi di più su M.A.W. 1968 ...

+ Rispondi al messaggio
Pagina 1 di 2 12 ultimoultimo

Potrebbero interessarti anche ...

  1. DB Properties : refresh (senza dover chiudere e riaprire il DB)
    Da Max.Riservo nel forum Microsoft Access
    Risposte: 8
    Ultimo Post: 13-06-2017, 12:37
  2. Prendere parte di testo da un file txt
    Da M4ndr4k377 nel forum Visual Basic .Net
    Risposte: 5
    Ultimo Post: 09-03-2014, 00:13
  3. Risposte: 7
    Ultimo Post: 20-07-2011, 09:13
  4. Vb6 invio email senza outlook
    Da corkor nel forum Visual Basic 6
    Risposte: 1
    Ultimo Post: 13-04-2010, 00:40
  5. Invio Email Senza Outlook
    Da nodux nel forum Microsoft Word
    Risposte: 11
    Ultimo Post: 01-12-2005, 08:51