【发布时间】:2016-07-17 15:44:47
【问题描述】:
如何测试以确保在以下代码中仅输入整数并确保输入长度为 5 个字节或更少?
我正在尝试了解如何正确控制输入,以便在退出程序时不会将超过 5 个字节的输入输出到终端。
另外,我将如何测试以确保只输入一个字符串,最后在最后一个场景中,只输入一个双精度数?
*** 根据 x82 和 Peter C 的指导更新了代码。我做了一些 C disas 并且能够在下面修改我的原始代码。它仍然有一些缺陷,但你们俩都是很大的帮助!我只是在输入超过 5 个整数字节时卡住了,它不会像我输入字符数据时那样重新提示,因为它继续将额外的字节数据转储到 tty。
SECTION .data ; initialized data section
promptInput db 'Enter Number: ', 0
lenPromptInput equ $ - promptInput
displayInput db 'Data Entered: ', 0
lenDisplayInput equ $ - lenDisplayInput
SECTION .bss ; uninitialized data section
number resb 1024 ; allocate 1024 bytes for number variable
SECTION .text ; code section
global _start ; linker entry point
_start:
nop ; used for debugging
Read:
mov eax, 4 ; specify sys_write call
mov ebx, 1 ; specify stdout file descriptor
mov ecx, promptInput ; display promptInput
mov edx, lenPromptInput ; length of promptInput
int 0x80 ; call sys_write
mov eax, 3 ; specify sys_read call
mov ebx, 0 ; specify stdin file descriptor
mov ecx, number ; pass address of the buffer to read to
mov edx, 1024 ; specify sys_read to read 1024 bytes stdin
int 0x80 ; call sys_read
cmp eax, 0 ; examine sys_read return value in eax
je Exit ; je if end of file
cmp byte [number], 0x30 ; test input against numeric 0
jb Read ; jb if below 0 in ASCII chart
cmp byte [number], 0x39 ; test input against numeric 9
ja Read ; ja if above 9 in ASCII chart
Write:
mov eax, 4 ; specify sys_write call
mov ebx, 1 ; specify stdout file descriptor
mov ecx, displayInput ; display displayInput
mov edx, lenDisplayInput ; length of displayInput
int 0x80 ; call sys_write
mov eax, 4 ; specify sys_write call
mov ebx, 1 ; specify stdout file descriptor
mov ecx, number ; pass address of the number to write
mov edx, 5 ; pass number of numbers to write
int 0x80 ; call sys_write
Exit:
mov eax, 1 ; specific sys_exit call
mov ebx, 0 ; return code 0 to OS
int 0x80 ; call sys_exit
【问题讨论】:
-
从 GOOGLE 搜索 ascii 表并检查字符、数字等的范围(和十六进制值)。作为一个小提示,您将检查 inputMsg 中的字符是否在 [a-z]-[A-Z] 范围内以进行字符串检查。对于长度检查,您应该寻找空终止符。仔细检查可能会有点困难,但我认为这不是不可能的。然后您可以根据您的特定需求微调您的算法。
-
谢谢。这是我根据您的帮助更新的代码。我现在得到,“在 1000 次通过后找不到所有标签的有效值,可能导致递归 EQU、宏滥用”。它不会编译。
-
查看这一行 lenDisplayInput equ $ - lenDisplayInput : 必须是 lenDisplayInput equ $ - displayInput
-
感谢它现在可以编译,但是代码根本无法按预期工作。我试图了解如何正确控制输入,以便在退出程序时不会将超过 5 个字节的输入输出到终端,以及我将如何测试以确保只输入一个字符串,最后在最后一个场景中,只有一个 double输入了吗?
-
为什么要一个一个地读字符?我认为最好为大约 30 个字符宽的输入分配一个缓冲区并允许用户一次输入所有内容,然后从头到尾检查缓冲区是否是整数、双精度或字符串,如果是则打印错误消息与您期望的任何格式都不匹配。无论如何,可能无法完全正常工作,但至少可以正常工作。它在第一次运行时永远不会起作用,否则你不会学到任何东西。努力吧:)