【发布时间】:2009-12-04 18:13:15
【问题描述】:
我在这里和其他地方看到过很多问题,为了获取输入数据,使用类似这样的方法:
...
printf("What's your name? ");
scanf("%s",name);
...
这很容易让人想起过去的 BASIC 时代(INPUT 记得它的人)。
这些问题中的大多数(如果不是全部)来自刚学习 C 的人,并且是家庭作业或从他们的书中摘录的示例。
我清楚地记得,当我学习 C 时,有人告诉我,这种类型的问答风格不是获取用户输入的好习惯。 “正确的方法”是在命令行(argv[...])上获取参数或从数据文件中读取以使用fgets() 进行解析。当用户友好是必须的时,termio 和朋友必须使用。
现在,我想知道过去几年是否有任何变化。人们现在是否将用户交互构建为一个固定的问题/答案?
我只能看到使用 printf()/scanf() 方法的缺点,主要是终端的多样性(有人^H吗?)这可能使用户难以纠正错误。
谁能指出这种方法的具体优势?
【问题讨论】:
-
C scanf 风格的函数永远不会看到像^H 这样的字符,我假设你的意思是退格。他们将在较低级别为您照顾。
-
termio 等不是 C 函数。在编写可移植的 C 语言时,确实没有比 printf() 提出问题和 fgets()/sscanf() 获得答案更好的方法了。 (scanf() 本身从根本上来说是不安全的,并且是公开邀请任何人溢出缓冲区。)
-
@Neil。是的,这意味着您无法控制用户在其终端上看到/执行的操作。我担心的是(未来的)程序员认为等待用户输入的 scanf() 是可以的,而我们知道用户的终端设置可能难以输入数据。对 ^H 的引用是针对显示 ^H 而不是退格的终端。高级用户知道如何解决终端设置问题,但普通用户可能会被卡住。在我看来,这仍然是不应该考虑的事情,因为它可能会产生坏习惯。
-
@大卫。我指的是一个程序不应该“提出问题”和“等待回应”的事实。用户可以预先设置输入数据(程序将通过命令行或文件获取数据),或者应该为他提供适当的用户界面。它可能就像使用 GNU readline(作为提到的答案之一)一样简单,使用 termio 或 conio 不可移植,图形(可能使用 tcl/tk)等。我的观点是 style 答案/不应促进用户交互中的响应,但我正在寻找支持这种风格的论据。
标签: c coding-style