2013-05-29 18 views
6

Tôi muốn hỏi nếu có cách nào để giữ con trỏ trong dòng hiện tại sau khi nhấn ENTER !!C/C++: Tôi có thể giữ con trỏ trong dòng hiện tại sau khi nhấn ENTER không?

ví dụ ...

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

Một ví dụ về đầu ra:

Enter a number : 10 
is a Even number 

... nhưng những gì tôi cần là một cái gì đó như thế:

Enter a number : 10 is a Even number 

Tôi muốn đặt "là số chẵn" (hoặc "là số lẻ") bên cạnh số được nhập bởi người dùng

+3

Đặt 'tty' của bạn trong chế độ thô. 'người đàn ông ncurses'. Hãy chuẩn bị cho rất nhiều công việc. –

+0

Đã xóa thẻ 'C++'. Đây là 'c'. – BoBTFish

+1

@BoBTFish: Đừng làm vậy. Nếu anh ta đang sử dụng trình biên dịch C++, thì đây là C++. –

Trả lời

1

Câu trả lời đơn giản là "bạn không thể ". Không có hàm C++ chuẩn nào để kiểm soát hành vi này, hoặc để đọc dữ liệu mà không cần nhấn vào cuối (trên thực tế, dữ liệu chưa thực sự được "nhập" cho đến khi bạn nhấn enter, vì vậy chương trình sẽ không thấy dữ liệu) .

Bạn có thể sử dụng chức năng không chuẩn, như thư viện bổ sung, chẳng hạn như thư viện "curses" hoặc mã phụ thuộc hệ thống, nhưng sau đó chúng tôi phải tạo mã để đọc từng ký tự và kết hợp mã mà bạn viết.

tôi sẽ đề nghị bạn nên sử dụng "lặp lại các đầu vào trong đầu ra", và chỉ cần làm một cái gì đó như thế này:

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

Người dùng đang nhấn enter và điều này đang được lặp lại và bắt đầu một dòng mới.

Để tránh điều này, bạn cần phải tắt tiếng vang (và sau đó đọc và lặp lại các ký tự riêng lẻ ngoại trừ dòng mới). Đây là hệ thống phụ thuộc, ví dụ trên Linux bạn có thể đặt tty vào chế độ thô/chưa nấu.

Bạn có thể tìm thấy thư viện, chẳng hạn như GNU readline thực hiện hầu hết công việc cho bạn.

0

không phải với printfscanf ... bạn đã thử với getc()ungetc(char) chưa?

OR, cố gắng chơi với printf("%c", (char)8); nếu tôi nhớ chính xác đó là một backspace

cách khác, có thể bạn sẽ phải sử dụng một số lượng lib như ncurses

+0

-1, nửa đầu của câu trả lời không thể hoạt động, bạn không thể backspace để "hoàn tác" trở lại vận chuyển và nguồn cấp dữ liệu dòng. – unwind

+0

Tôi đã thử với gechar() nhưng không hoạt động ... giống như những gì '@Mats Petersson' & '@Ben Voigt' nói, không có bất kỳ chức năng tiêu chuẩn nào có thể làm được ... – BBeta

+1

I xin lỗi tôi đã lừa dối bạn ... Tôi nhớ rằng tôi đã viết (char) 8 để xóa màn hình ở chế độ 3, int10h, nhưng có lẽ không áp dụng ở đây. Vì chúng ta đang ở trong những thứ kỳ lạ, kbhit() của conio.h http://www.cprogramming.com/fod/kbhit.html nếu nền tảng của bạn hỗ trợ nó (không chuẩn) – Exceptyon

1

Thiết lập chế độ bàn phím thô và tắt chế độ kinh điển. Đó là gần như cách linux quản lý không hiển thị các ký tự mật khẩu trong terminal.

Cấu trúc Termio là thứ bạn nên google.

Một liên kết là:

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

Các hằng số của hội đồng cũng có sẵn cho một ioctl syscall.

1

Thủ thuật này có thể hữu ích nếu bạn có thiết bị đầu cuối kiểu vt100: chuyển động của con trỏ.

\033 là ESC, ESC + [ + A là con trỏ lên, ESC + [ + C là con trỏ sang phải

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; 
} 
Các vấn đề liên quan