首页 > 解决方案 > 如何在 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)并且用户可以使用一个或多个条件进行搜索。这意味着他们可以仅通过姓名和电子邮件进行搜索。

标签: cconsole-application

解决方案


如果您希望用户可以通过使用箭头键在屏幕上移动光标然后按下ENTER键来激活它们来检查“复选框”,那么您无法使用 C 标准库执行此操作,但您可能可以做到使用特定于平台的 API。例如,如果您在 Linux 平台上,则可以使用ncurses。但是,您最好创建一个适当的图形应用程序,而不是控制台应用程序。

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

在评论部分,您特别要求提供代码来向您展示搜索循环的外观。因此,我为您编写了这样一个循环。

此循环要求创建一个struct Person具有名称lf(代表“寻找”)的类型变量并填充所有搜索条件。只需要设置实际搜索的字段。其余字段可以保持未初始化。bool此外,必须使用名称 和 来创建should_match_name三个should_match_city类型的变量should_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
        );
    }
}

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


推荐阅读