如何在 C 中实现带有可选输入字段的表单?

How to implement a form with optional input fields in C?

我正在开发一个控制台程序,该程序允许在名为 Person

的结构数组中进行搜索

为简单起见,我现在假设所有属性都是整数。

typedef struct Person {
    int name;
    int city;
    int email;
} Person;

所以比较函数看起来像这样:

int comparing(int x, int y) {
    return x == y;
}

我正在尝试创建一个搜索功能,允许用户使用 comparing(int x, int y) 并且用户可以使用一个或多个条件进行搜索。这意味着他们可以仅按姓名和电子邮件等进行搜索。

如果您想要“复选框”,用户可以通过使用箭头键在屏幕上移动光标来选中,然后按 ENTER 键激活它们,然后你不能用 C 标准库做到这一点,但你可能可以用特定于平台的 API 做到这一点。例如,如果您在 Linux 平台上,则可以使用 ncurses。但是,您最好创建一个适当的图形应用程序,即不是控制台应用程序。

如果你想让它成为一个简单的文本控制台应用程序,只使用 C 标准库的特性,那么你可以有一个文本菜单,用户可以在其中指定他想要切换一个复选框,然后它询问用户他想切换哪个复选框编号。每次更改复选框后,程序都会重新打印所有复选框以向用户显示复选框的新状态。

在评论部分,您特别要求提供代码来向您展示搜索循环应该是什么样子。所以,我写了这样一个循环给大家。

此循环要求创建一个类型为 struct Person 且名称为 lf(代表“查找”)的变量并填充所有搜索条件。只需设置实际搜索的字段。其余字段可以保持未初始化状态。此外,必须创建三个类型为 bool 的变量,名称为 should_match_nameshould_match_cityshould_match_email。必须设置这三个变量来指定是否搜索对应的字段,如果设置为true,则还必须在lf变量中设置对应的字段。请注意,您必须 #include <stdbool.h> 才能启用对 bool 变量类型的支持。

循环可能如下所示:

for ( int i = 0; i < number_of_valid_elements_in_array; i++ )
{
    if (
        ( !should_match_name  || lf.name  == array[i].name  ) &&
        ( !should_match_city  || lf.city  == array[i].city  ) &&
        ( !should_match_email || lf.email == array[i].email )
    )
    {
        printf(
            "Matching person found:\nName: %d\nCity: %d\nE-Mail: %d\n\n",
            array[i].name, array[i].city, array[i].email
        );
    }
}

请注意,更复杂的搜索算法(例如数据库引擎中使用的算法)不会搜索所有元素以找到匹配项,而是使用索引进行搜索。这使得搜索速度明显加快。不过,这些索引必须提前创建。但只要你的元素少于一百万,它可能就没有关系。