0

是否可以在 C 中让用户通过将光标移动到所需值然后按Enterspace键确认选择来从先前打印在屏幕上的数据中“选择”一个值?

举例说明:

在以下代码中:

    int x[10] = {1,2,3,4,5,6,7,8,9,10};

    int i;
    for(i = 0; i < 10; ++i){
        printf("%i ", x[i]);
    }

输出将是:

1 2 3 4 5 6 7 8 9 10

既然用户正在查看输出,是否可以让他使用箭头键将光标移动到所需位置并让输入成为用户选择的任何内容?

4

4 回答 4

4

使用某种编程库,允许程序员以独立于终端的方式编写基于文本的用户界面。例如,ncurses

于 2013-06-07T18:54:07.430 回答
2

感谢所有输入的家伙。在您将我指向库 curses.h 之后,我能够实现我想要的,所以我将在这里与您分享结果。

一些注意事项:

  • curses.h 仅与类似 UNIX 的操作系统兼容。我读到可以将程序移植到 Windows,但我没有对此进行研究。

  • 编译源代码时需要链接curses.h库

    -> g++ 文件名.c -lcurses

  • 一些变量和函数名称不是英文的,但我确保将它们全部注释掉。

    #include <stdio.h>
    #include <curses.h>
    #include <stdlib.h>
    
    WINDOW *janela;         // Points to a Windows Object
    int xPos;               // current x cursor position
    int yPos;               // current y cursor position
    
    
    int main(void){
    
    // Declaration of all functions
    void moverEsquerda(void);   //move left
    void moverDireita(void);    //move right
    void moverCima(void);       //move up
    void moverBaixo(void);      //move down
    int lerInt(void);           //read value
    
    char c;             // This variable stores the user input(up, down, left, etc...)
    
    janela = initscr(); // curses call to initialize window
    noecho();           // curses call to set no echoing
    cbreak();           // curses call to set no waiting for Enter key
    
    int tabela[4][4]; // This array is just for demonstration purposes
    tabela = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16};
    
    // places the cursor at 0,0
    xPos = 0;
    yPos = 0;
    move(yPos, xPos);
    
    int num;    // Stores the select by the user
    // The following while is executed until the user presses an
    // "invalid key"
    while (1) {
        c = getch();
        if     (c == 'w')   moverCima();        
        else if(c == 's')   moverBaixo();       
        else if(c == 'a')   moverEsquerda();    
        else if(c == 'd')   moverDireita();     
        else if(c == '\n'){ // If user presses Enter the caracter is writen in a txt file
            FILE *file = fopen("test.txt", "a");
            num = (int)inch();
            fprintf(file, "Voce selecinou o numero %c\n", num);
            fclose(file);
        }
        else {
            endwin(); //ends window object
            break;    //exit the loop
        }
    }
    
        return 0;
    }
    
    void moverCima(void){
    
        --yPos;
        move(yPos, xPos);
    }
    
    void moverBaixo(void){
    
        ++yPos;
        move(yPos, xPos);
    }
    
    void moverDireita(void){
    
         ++xPos;
         move(yPos, xPos);
    }
    
    void moverEsquerda(void){
    
        --xPos;
        move(yPos, xPos);
    }
    
于 2013-06-08T19:09:14.780 回答
1

不容易,这将取决于系统。您将需要一个光标定位库。例如,cursesncurses

于 2013-06-07T18:53:27.077 回答
0

我知道让您的程序识别正在使用的箭头键的“最简单”方法是ncurses. 是意大利语教程。

于 2013-06-07T18:54:11.040 回答