文章来源于网络收集而来,版权归原创者所有,如有侵权请及时联系!
3.1 主循环
程序的主循环从标准输入读取一行数据,初始化以便数字和操作符能被提取出来,空格被忽略,调用一个函数去确认正确的算术表达式并存储之,最终处理所存储的表达式。如果出错了,我们简单的读取下一行数据。如下为主循环:
#include <setjmp.h>
int main (void)
{
volatile int errors = 0;
char buf [BUFSIZ];
if (setjmp(onError)){
++ errors;
}
while (fgets(buf, sizeof buf, stdin)){
if (scan(buf))
{ void * e = sum();
if (token){
error("trash after sum");
}
process(e);
delete(e);
}
}
return errors > 0;
}
void error (const char * fmt, ...)
{
va_list ap;
va_start(ap, fmt);
vfprintf(stderr, fmt, ap), putc('/n', stderr);
va_end(ap);
longjmp(onError, 1);
}
错误恢复点被使用 setjmp()
所定义。如果 error()
在程序中的某个位置被调用, longjmp()
伴随着从 setjmp()
另外一个返回而继续执行。在这种情况下,结果是一个值被传进 longjmp()
,错误累加,而且下一个输入行被读取。如果遇到错误,程序的出口代码将报告错误。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论