2013-05-29 5 views
6

Vorrei chiedere se c'è un modo per mantenere il cursore nella riga corrente dopo aver premuto ENTER !!C/C++: Posso mantenere il cursore sulla riga corrente dopo aver premuto ENTER?

per esempio ...

#include<stdio.h> 
int main() 
{ 
    int d=0; 
    printf("Enter a number : "); 
    scanf("%d",&d); 

    if(d%2)printf(" is a Odd number\n"); 
    else printf(" is a Even number\n"); 
    return 0; 
} 

Un esempio di output:

Enter a number : 10 
is a Even number 

... ma quello che ho bisogno è qualcosa di simile:

Enter a number : 10 is a Even number 

voglio mettere "è un numero pari" (o "è un numero dispari") accanto al numero inserito dall'utente

+3

Metti il ​​tuo 'tty' in modalità raw. 'uomo ncurses'. Preparati per molto lavoro. –

+0

Rimosso il tag 'C++'. Questo è 'c'. – BoBTFish

+1

@BoBTFish: non farlo. Se sta usando un compilatore C++, questo è C++. –

risposta

1

La semplice risposta è "non si può ". Non ci sono funzioni C++ standard per controllare questo comportamento, o per leggere i dati senza premere invio alla fine (in effetti, i dati non sono stati realmente "immessi" finché non si preme enter, quindi il programma non vedrà i dati) .

È possibile utilizzare funzionalità non standard, ad esempio librerie aggiuntive, come una libreria "curses" o un codice dipendente dal sistema, ma dovremmo quindi produrre il codice per leggere i caratteri uno alla volta e unirlo insieme utilizzando codice che scrivi

vorrei suggerire che si utilizza il "ripetere l'input nell'output", e semplicemente fare qualcosa del genere:

printf("%d is", d); 
if (d%2) 
    printf("an odd number\n"); 
else 
    printf("an even number\n"); 
3

L'utente sta premendo enter, e questo viene riportato all'eco e all'avvio di una nuova riga.

Per evitare ciò, è necessario disattivare eco (e quindi leggere ed echo singoli caratteri ad eccezione di una nuova riga). Questo dipende dal sistema, per esempio su Linux puoi mettere il tty in modalità raw/non cotta.

È possibile trovare una libreria come GNU readline che fa la maggior parte del lavoro per voi.

0

non con printf e scanf ... hai provato con getc() e ungetc(char)?

O, provare a giocare con printf("%c", (char)8); se non ricordo male che è un backspace

altrimenti, probabilmente dovrete usare qualche uscita lib come ncurses

+0

-1, la prima metà della risposta non può funzionare, non è possibile backspace per "annullare" un ritorno a capo e line feed. – unwind

+0

Ho provato con gechar() ma non funziona ... è come quello che dice '@Mats Petersson' e '@Ben Voigt', non c'è alcuna funzione standard che possa farlo ... – BBeta

+1

I Mi dispiace di averti ingannato ... Mi sono ricordato di aver scritto (char) 8 per cancellare lo schermo in mode3; int10h, ma probabilmente non si applica qui. Dato che siamo comunque in roba strana, kbhit() di conio.h http://www.cprogramming.com/fod/kbhit.html se la tua piattaforma lo supporta (non standard) – Exceptyon

1

Impostare la modalità tastiera crudo e disabilitare la modalità canonica. Quasi, come Linux non riesce a mostrare i caratteri della password nel terminale.

Termio struct è la cosa che dovresti cercare su Google.

Un collegamento è:

http://asm.sourceforge.net/articles/rawkb.html

le costanti del gruppo sono disponibili anche per un ioctl syscall.

1

Questo trucco può aiutare, se si dispone di un terminale in stile vt100: movimenti del cursore.

\033 è ESC, ESC + [ + A è cursore verso l'alto, è ESC + [ + C cursore a destra

int main() 
{ 
    int d=0; 
    printf("Enter a number : "); 
    fflush(stdout); 
    scanf("%d",&d); 
    printf("\033[A\033[18C%d is a an %s number\n", d, d%2 ? "odd" : "even"); 
    return 0; 
} 
Problemi correlati