1

我正在创建一个 MIPS 模拟器,并且遇到了一个我认为有多种解决方案的点。SPIM 使用系统调用操作模拟从控制台读取。我以前使用过 SPIM,但目前无法访问它。从控制台读取时如何处理不正确的类型?例如,如果您对 read_int 进行系统调用,然后输入“asdf”然后按 Enter,会发生什么?应该发生什么?SPIM 参考表明它从行中读取一个整数,并忽略该整数之后的任何内容,这只是第一个数字序列的正则表达式匹配。当首先有非数字,然后是数字,然后是更多的非数字时会发生什么?没有数字怎么办?

我不希望重新创建 SPIM,我想我会从社区那里得到关于他们希望 MIPS 模拟器在输入错误类型时如何执行的建议。

需要考虑的一些可能的输入:
1234(正确)
a1234(这应该怎么做?)
a1234b(这应该怎么做?)
ab(这应该怎么做?)
(只需按回车键应该做什么?)

谢谢!

4

1 回答 1

1

为了回答这个问题,我检查了spim 源代码。它并没有那么大,所以很容易找到syscall.c,它说READ_INT_SYSCALL是使用atol.

atol可以在 Internet 上的任何位置或您的系统手册中找到有关文档,但为了完整起见:

描述

atoi() 函数将 nptr 指向的字符串的初始部分转换为 int。行为与

strtol(nptr, NULL, 10); 除了 atoi() 不检测错误。

atol() 和 atoll() 函数的行为与 atoi() 相同,只是它们将字符串的初始部分转换为其返回类型 long 或 long long。atoq() 是 atoll() 的过时名称。

返回值

转换后的值。

我意识到这并不能真正回答您的问题,因为事实证明 atoi 的行为或多或少是未定义的。您可以在此处查看 POSIX 标准,其中说“如果无法表示值,则行为未定义”或查看此SO 答案

于 2014-05-29T17:00:59.340 回答