【问题标题】:check for error while reading file though fgets()通过 fgets() 读取文件时检查错误
【发布时间】:2019-09-22 21:53:18
【问题描述】:

我想知道如何检测fgets() 上的错误,我正在编写测试类,所以我想检查用户是否在fgets() 上输入了错误的缓冲区大小,我想显示一条消息并不要让程序自行退出

char a[10];

fgets(a,100,stdin);

我想让程序以状态 2 退出,因为我会澄清发生的错误

【问题讨论】:

  • 不是用户输入了错误的缓冲区大小。在您的示例中,程序员犯了错误。您要求运行时检查编译时错误。
  • 这将导致检测到堆栈粉碎,我不希望程序退出。我需要显示其他消息
  • 你不能;您破坏了堆栈,您的代码将不再正常运行,因此您不能保证任何处理代码都会正常运行。事实上,即使操作系统会检测到它也不是给定的——它不是由不执行边界检查的语言定义的。仅当访问无效内存时,操作系统才会检测到它。一些调试器将执行检查。您必须在错误发生之前检测到错误。这是一个明显的编码错误,您需要修复它。允许用户输入 100 个字节,但提供仅 10 个字节的缓冲区是您的错误,而不是用户的错误。
  • 我知道这是程序员的错误,我也想检测一下,
  • 你问的不是这个。

标签: c arrays indexoutofboundsexception fgets


【解决方案1】:

编程问题最好通过良好的编程实践、静态分析、测试和调试让用户松手来解决。您需要为其编写代码的错误类型是由于错误的输入而可能在运行时发生的错误。如果您在代码中编写未检测到的错误,则编写更多代码来检测它们几乎没有意义。

在您的示例中,减少编码错误机会的更好编码实践是:

char a[10] ;

fgets( a, sizeof(a), stdin ) ;

【讨论】:

  • @bigdataolddriver fgets() 返回指针、a 或空指针。 fgets() 不返回字符。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-16
相关资源
最近更新 更多