使用 C 中的许多选项来接收用户输入的最有效方法是什么?

What is the most efficient way to take in user input with many options in C?

我正在编写一个为数据调用 API 的天气程序。其中一个可用的标志是首选语言,其中有大约 45 个选项。这引出了我的问题。

显示所有语言选项,然后允许用户输入,然后检查有效输入的最有效方法是什么?

我最好的想法是循环打印文件中的所有选项。然后用户输入一个选项。根据列表检查他们的选择以找到匹配项。如果匹配,则程序继续。如果没有,将再次提示他们。

这是解决此问题的最佳方法吗?我正在努力使这个程序尽可能高效和专业,因为我正在将它用于我的作品集。

My best idea is a loop that prints all the options from a file. The user then inputs an option. Their selection is checked against the list to find a match. If there is a match then the program continues. If not, they are prompted again.

Is this the best way to go about this? I'm trying to make this program as efficient and professional looking as possible as I'm using it for my portfolio.

总是存在多个相互竞争的目标(单线程性能、可扩展性、特性、flexibility/extendibility、代码可读性、容错性)。对于设计良好的代码,最好了解这些目标中的每一个对每段代码的重要性(并且最好理解这些重要性对于同一项目中的不同代码段可能不同)。对于这段特定的代码;我会说 flexibility/extendibility(例如以后轻松添加新语言的能力)是最重要的,其次是代码可读性(以后理解代码的能力,以及其中的 find/fix 错误)。最不重要的是可伸缩性(例如,当 CPU 数量增加时性能会提高多少)然后是单线程性能;因为代码只需要工作一次,并且受制于人类无论如何都可以输入的速度。

Is this the best way to go about this? I'm trying to make this program as efficient and professional looking as possible as I'm using it for my portfolio.

在“人机交互”方面;最好的方法是让用户无法输入无效数据(例如,具有预测良好的默认值的下拉列表,以避免需要“尚未设置”选项)。第二个最好的方法是“活动状态”——具体来说,对于每个“用户输入事件”(按键、鼠标点击等),与输入 field/control 对应的状态字段被更新以指示 field/input 处于可接受的状态,或提供不可接受的原因;用户不可能继续(例如,因为“确定”按钮被禁用),直到所有状态字段都表明输入是可接受的。对于这两个选项,之后都无需验证提交的输入。

悲哀;对于“命令行”,几乎不可能使用最好的方式,也几乎不可能使用第二好的方式。

换句话说;你需要忘记 performance/efficiency (因为那是最不重要的);然后忘记编写 good/user-friendly 的软件(因为它是命令行)。

接下来的问题是;什么是“最不坏”的选择?为了这;我首先假设每种语言的数据都存储在一个单独的文件(或目录?)中,文件名可用于显示目的;并且所有数据都在特定目录中(例如,包含“project/lang/UK_English”文件的“project/lang”目录,“project/lang/Spanish”文件, ETC)。在这种情况下,您可以获得“project/lang”目录中的文件列表,按字母顺序对它们进行排序,并使用它们显示编号选项列表(“1)西班牙语”,“2)英国英语” ,..)。然后 if/when 用户选择一个选项,您可以对其进行验证(如果用户输入了错误字符、数字太高等,则报告任何错误,然后要求用户重试);并为他们选择的任何语言加载正确的文件(如果文件有问题则报告任何错误并要求用户选择其他语言)。

那样; people/translators可以直接新建文件,none的代码需要修改

为了比较;最快的方法是使用常量字符串(例如 puts("1) Spanish\n2) UK English\n\nEnter language choice:"));并预测用户将选择什么(例如,基于跟踪他们上次选择的内容)并在后台“预取和预解析”(希望所有工作都在用户之前完成正确的选择实际上做出选择),如果用户做出未预料到的选择,则能够快速取消“预取和预解析”工作。这对性能非常好(可能是“即时的”),但非常糟糕(不灵活、过于复杂、难以维护)。