【问题标题】:OS X move terminal caret with arrow keysOS X 使用箭头键移动终端插入符号
【发布时间】:2017-04-28 14:07:24
【问题描述】:

我制作了一个简单的 C 程序来演示这个问题。在这里。

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

问题在于,当应用程序正在等待用户使用 scanf() 输入并且用户想要编辑他键入的行并使用箭头移动插入符号时,插入符号不会移动,但会插入新的丑陋输入。

由于某种原因,它没有以我期望的方式处理密钥。我也无法使用向上键转到上一个键入的行。

显然我应该故意启用这种行为。你能建议,我该怎么做?

【问题讨论】:

  • 您可能必须使用 ncurses 库(或 OS X 上的等效库)才能执行您所说的那种面向终端的 I/O。标准的 C I/O 函数处理字符流,因此它们不能很好地处理终端发送的转义字符。
  • 我想过这样的库,但是终端不应该自己处理吗?许多应用程序都允许这种操作,而且它们都使用非标准库似乎很奇怪。
  • 他们都使用非标准库,因为没有标准库可以使用。

标签: c++ c terminal command-line-interface


【解决方案1】:

使用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) */

【讨论】:

    猜你喜欢
    • 2018-12-13
    • 1970-01-01
    • 2014-10-05
    • 1970-01-01
    • 1970-01-01
    • 2019-10-27
    • 1970-01-01
    • 1970-01-01
    • 2015-08-30
    相关资源
    最近更新 更多