C 语言控制台输入实现表单样式的交互
时间: 2023-10-04 11:07:13 浏览: 38
要在控制台上实现表单样式的交互,可以使用 C 语言中的 `ncurses` 库来控制终端窗口和用户输入,同时使用上面提到的结构体和函数来描述和操作表单元素。
以下是一个基于 `ncurses` 库的表单实现示例:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ncurses.h>
// 定义一个结构体来描述表单元素
typedef struct {
char *label; // 元素标签
char *value; // 用户输入的值
} FormElement;
// 定义一个结构体来描述表单
typedef struct {
int num_elements; // 表单元素数量
FormElement *elements; // 表单元素数组
int current_index; // 当前选中的元素索引
} Form;
// 初始化表单
Form *init_form(int num_elements) {
Form *form = malloc(sizeof(Form));
form->num_elements = num_elements;
form->elements = calloc(num_elements, sizeof(FormElement));
form->current_index = 0;
return form;
}
// 释放表单内存
void free_form(Form *form) {
for (int i = 0; i < form->num_elements; i++) {
free(form->elements[i].label);
free(form->elements[i].value);
}
free(form->elements);
free(form);
}
// 添加表单元素
void add_form_element(Form *form, int index, char *label) {
form->elements[index].label = strdup(label);
form->elements[index].value = NULL;
}
// 显示表单
void show_form(Form *form) {
clear();
move(0, 0);
printw("Please fill out the form:\n");
for (int i = 0; i < form->num_elements; i++) {
if (i == form->current_index) {
attron(A_REVERSE);
}
printw("%s: ", form->elements[i].label);
if (form->elements[i].value) {
printw("%s\n", form->elements[i].value);
} else {
printw("(not filled)\n");
}
if (i == form->current_index) {
attroff(A_REVERSE);
}
}
refresh();
}
// 处理用户输入
void handle_input(Form *form, int input) {
if (input == KEY_UP) {
form->current_index--;
if (form->current_index < 0) {
form->current_index = form->num_elements - 1;
}
} else if (input == KEY_DOWN) {
form->current_index++;
if (form->current_index >= form->num_elements) {
form->current_index = 0;
}
} else if (input == '\n') {
char input_str[256];
echo();
curs_set(1);
move(form->current_index, strlen(form->elements[form->current_index].label) + 2);
getstr(input_str);
noecho();
curs_set(0);
free(form->elements[form->current_index].value);
form->elements[form->current_index].value = strdup(input_str);
}
}
int main() {
// 初始化表单
Form *form = init_form(2);
add_form_element(form, 0, "Name");
add_form_element(form, 1, "Age");
// 初始化 ncurses
initscr();
cbreak();
noecho();
keypad(stdscr, TRUE);
curs_set(0);
// 显示表单和处理用户输入
int input;
do {
show_form(form);
input = getch();
handle_input(form, input);
} while (input != 'q');
// 清理 ncurses 和释放表单内存
endwin();
free_form(form);
return 0;
}
```
这个示例实现了一个带样式的表单交互界面,用户可以使用上下箭头切换选中的元素,然后输入对应的值。在输入时,光标会自动跳到对应的位置,并且输入的值会被实时显示。用户可以按下 `q` 键来退出程序。
你可以根据需要进行修改和扩展,比如增加表单元素类型、校验输入等功能。