2016-12-13 2 views
0

Я сделал простую программу на C, которая демонстрирует проблему. Вот.OS X перемещение терминала с клавишами со стрелками

#include <stdio.h> 

int main(int argc, const char * argv[]) { 
    char buffer[128]; 
    memset(buffer, 0, sizeof(buffer)); 

    printf("Type data:\n"); 
    scanf("%126s", buffer); 

    printf("%s\n", buffer); 

    getchar(); 
    return 0; 
} 

Проблема заключается в том, что, когда приложение ожидает ввода пользователя с зсапЕ() и пользователь пользователь хочет изменить линию он напечатанный, и сделать перемещение каретки со стрелками, каретка не движется, но новый некрасиво вход вставляется. enter image description here

По какой-то причине он не обрабатывает ключи так, как я ожидаю. Я также не могу перейти к предыдущей типизированной строке с ключом вверх.

Очевидно, что я должен сознательно включить это поведение. Могли бы вы посоветоваться, как я могу это сделать?

+0

Возможно, вам понадобится использовать библиотеку ncurses (или ее эквивалент на OS X), чтобы иметь возможность использовать тип терминального ввода-вывода, о котором вы говорили. Стандартные функции ввода/вывода C связаны с потоком символов, поэтому они не обрабатывают символы эвакуации, отправленные терминалами. –

+0

Я думал о такой библиотеке, но не должен ли терминал обрабатывать это сам? Многие приложения допускают такую ​​манипуляцию, и кажется странным, что все они используют нестандартные библиотеки. – Ivan

+2

Все они используют нестандартные библиотеки, потому что нет стандартной библиотеки для использования. –

ответ

2

readline(). Вот простой пример:

#include <stdio.h> 
#include <readline/readline.h> 
#include <readline/history.h> 
#include <ctype.h> 

#define MAX_LINE_LEN 80 

int main() { 
    char *line_buffer; 
    int n, i; 

    while (1) { 
    line_buffer = readline("Say something: "); 
    if (!line_buffer) break; 
    for (i=0; line_buffer[i]; i++) { 
     line_buffer[i] = toupper(line_buffer[i]); 
    } 
    printf("YOU SAID: %s\n",line_buffer); 
    } 
    putchar('\n'); 
    return 0; 
} 

/* (Compile with cc foo.c -lreadline -o foo) */ 
0

Проблема вы видите, что клавиши со стрелками действительно карту с конкретными значениями, которые затем отображаются при печати строки. Библиотека readline(), упомянутая выше, просто принимает символы, введенные по одному за раз, и захватывает клавиши со стрелками для выполнения функций редактирования, которые вы ожидали.

Смежные вопросы