【问题标题】:C style printf/scanfC 风格 printf/scanf
【发布时间】: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


【解决方案1】:

这种结构易于解释和学习,这就是为什么它出现在这么多介绍性材料中的原因。在 C 语言中以“正确的方式”进行用户输入对于新手来说似乎相当令人生畏,尤其是当您必须处理标记化和转换时。

但是,我同意介绍性材料展示更强大的处理用户输入的方法是很有价值的。

【讨论】:

  • 易于解释是我能看到的唯一优势。但这不就是老师的懒惰吗? :)
【解决方案2】:

我一直认为 Unix 的方式是接受来自标准输入的输入。这样,命令的调用者可以通过管道输入来自另一个命令、文件或手动的输入。

【讨论】:

  • +1。我试着向我的“Java 教授”解释这一点,但他不买账。但他也是一个 Windows 人,他喜欢拖放 GUI 构建。所以他让我重做一个程序来做问答式。我只是让它构造命令行参数,然后将它传递给我已经创建的函数来处理参数。有些人就是不适合按照我猜的方式做事。
【解决方案3】:

fgets() / sscanf() 或类似是接受用户输入的正确方式。

用(大)一小撮盐把你在这里和其他地方读到的东西拿走。

【讨论】:

    【解决方案4】:

    GNU readline 库确实是一个很好的资源。它的主要优点是它可以处理所有复杂的编辑,以及让用户拥有自己的输入设置,例如 Vi 或 Emacs 模式。

    这是 bash 库和许多其他接受基于行的交互式数据使用的程序。 通过使用该库,您可以获得一个界面,您的用户将了解如何使用,此外,您还可以获得各种不错的功能,而无需显式地编写代码来支持行编辑。

    【讨论】:

    • 同意。我可以总结一下,作为用户,您更愿意让一个程序使用 readline 来处理您的输入,而不是留在一个野生终端上等待 scanf() ?
    【解决方案5】:

    我同意 CTFord 的观点,如果您正在执行命令行程序,那么 stdin 是处理输入的完全合理的方式。

    然而,现在,正确的方法是制作一个包含文本框、标签和按钮的窗口,等等等等。

    我知道这并不能真正回答您的问题,但我认为我的观点是这种编程风格已经变得不那么流行了,因此“正确”的内容并不重要。

    【讨论】:

    • 我同意这种情况不太普遍,但在某些情况下,GUI 会过度杀伤或明显不正确。我希望教师和介绍性书籍不会提倡一种与“正确”方式相比没有优势的交互方式(我认为这很重要:))
    【解决方案6】:

    在许多情况下,如果您认为这很重要,您可能会错过练习的重点。家庭作业和现实世界的程序之间存在天壤之别。这种练习的目的很少,如果有的话,教用户界面设计。您描述的技术通常只是为实际练习获取测试输入的一种简单方法,并且也可能受到导师的鼓励,他们时间紧迫,要求提交的代码遵循某种“课程风格”以使标记更容易。 “Course-style”与“good-practice”或“practical style”很少是一回事,但这并不是说它没有任何目的,甚至不是说这种目的对学生的教育有益。

    不幸的是,当这些东西通常与练习的实际目的无关时,新手经常会被这些东西挂断。问题是使用标准库原语的用户输入并不是万无一失的,一些导师似乎认为。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-06-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-15
      相关资源
      最近更新 更多