c - 如何在 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_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
);
}
}
请注意,更复杂的搜索算法(例如在数据库引擎中使用的算法)不会搜索所有元素以找到匹配项,而是使用索引进行搜索。这使得搜索速度显着加快。但是,这些索引必须提前创建。但只要你有少于一百万个元素,它可能并不重要。
推荐阅读
- node.js - 向世界开放 Nodejs 服务器端口是否安全?
- azure - Azure 中的 ansible VM 可以查询自己的 VM 标签吗?
- asynchronous - 实现异步“优先级”分块的最佳方法是什么?
- java - 地图的分组和聚合列表
- web - 无法让 Scrapy 在 Mac Os Catalina 上工作
- java - 符合 FIPS 140-2 - Oracle 开源“jdk1.8.0_151”
- sql - SQL - 用+=连接变量while循环中的字符串
- php - Symfony - 有没有办法将实体设置为全局?
- wpf - 需要使用 WPF 中的控件模板和数据触发器更改网格中的边框颜色
- html - 禁用时如何为选择占位符提供样式?