如何在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标准库的功能,那么你可以有一个文本菜单,用户可以在其中指定他想切换一个复选框,然后它会询问用户他想切换哪个复选框号。每次更改复选框后,程序都会重新打印所有复选框,以向用户显示复选框的新状态。

在注释部分,您特别要求提供代码来显示搜索循环的样子。因此,我为你写了这样一个循环。

这个循环要求创建一个名为lf(代表"查找"(的类型为struct Person的变量,并用所有搜索条件填充。只需要设置实际正在搜索的字段。其余字段可以保持未初始化状态。此外,必须创建三个类型为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: %dnCity: %dnE-Mail: %dnn",
array[i].name, array[i].city, array[i].email
);
}
}

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

最新更新