2013-05-29 4 views
6

Chciałbym zapytać, czy istnieje sposób na utrzymanie kursora w bieżącej linii po naciśnięciu klawisza ENTER !!C/C++: Czy mogę trzymać kursor w aktualnym wierszu po naciśnięciu ENTER?

na przykład ...

#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; 
} 

Przykładem wyjścia:

Enter a number : 10 
is a Even number 

... ale to, co potrzebne jest coś takiego:

Enter a number : 10 is a Even number 

chcę put "to liczba parzysta" (lub "jest liczbą nieparzystą") obok numeru wprowadzonego przez użytkownika

+3

Połóż 'tty' w trybie surowym. 'man ncurses'. Przygotuj się na dużo pracy. –

+0

Usunięto znacznik 'C++ '. To jest "c". – BoBTFish

+1

@BoBTFish: Nie rób tego. Jeśli używa kompilatora C++, to jest to C++. –

Odpowiedz

1

Prosta odpowiedź brzmi „nie można ". Nie ma standardowych funkcji C++ do kontrolowania tego zachowania lub do odczytu danych bez wciskania Enter na końcu (w rzeczywistości dane nie zostały faktycznie "wprowadzone" dopóki nie naciśniesz Enter, więc program nie zobaczy danych) .

Możesz użyć niestandardowych funkcji, takich jak dodatkowe biblioteki, takie jak biblioteka "curses" lub kod zależny od systemu, ale wtedy będziemy musieli wygenerować kod, aby czytać znaki po jednym na raz i scalać je razem kod, który piszesz.

Sugerowałbym, że używasz „Repeat wejście na wyjściu”, a po prostu zrobić coś takiego:

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

Użytkownik naciska przycisk enter, który jest odtwarzany z powrotem i rozpoczyna nowy wiersz.

Aby tego uniknąć, należy wyłączyć echo (a następnie odczytywać i echo pojedynczych znaków z wyjątkiem znaków nowej linii). Jest to zależne od systemu, na przykład w systemie Linux możesz ustawić tty w trybie surowym/niegotowanym.

Możesz znaleźć bibliotekę, taką jak GNU readline, która wykonuje większość pracy za Ciebie.

0

nie z printf i scanf ... Czy próbowałeś z getc() i ungetc(char)?

OR, starają się grać z printf("%c", (char)8); jeśli dobrze pamiętam, że to Backspace

inaczej, prawdopodobnie będziesz musiał użyć jakiegoś wyjścia lib, takich jak ncurses

+0

-1, pierwsza połowa odpowiedzi nie działa, nie można cofnąć, aby "cofnąć" powrót karetki i wiersz. – unwind

+0

Próbowałem z gechar(), ale nie działa ... to tak, jak powiedział "@Mats Petersson" i "@ Ben Voigt", nie ma żadnej standardowej funkcji, która może to zrobić ... – BBeta

+1

I Przepraszam, że cię wprowadziłem w błąd ... Przypomniałem sobie, że napisałem (char) 8, aby wyczyścić ekran w trybie 3, int10h, ale prawdopodobnie nie ma tu zastosowania. Ponieważ i tak jesteśmy w dziwnych rzeczach, kbhit() conio.h http://www.cprogramming.com/fod/kbhit.html, jeśli twoja platforma go obsługuje (nie jest standardowa) – Exceptyon

1

Skonfiguruj trybie RAW klawiatury i wyłączyć tryb kanoniczny. To prawie tak, jak linuksowi udaje się nie wyświetlać znaków hasła w terminalu.

Termio struct jest tym, na co należy google.

Jedno ogniwo jest:

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

Stałe zespole są również dostępne dla ioctl syscall.

1

Ta sztuczka może pomóc, jeśli masz terminal w stylu vt100: ruchy kursora.

\033 jest ESC, ESC + [ + A jest kursor w górę, ESC + [ + C jest kursor w prawo

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