我有以下代码:
.align 32
.data
input1: .string "Give short: \n"
input2: .string "Give char: \n"
arg1: .string "%hu"
arg2: .string "%c"
output1: .string "%hu\n"
output2: .string "%c\n"
short: .short 1
char: .byte 1
.global main
main:
pushl %ebp
movl %esp, %ebp
pushl $input1
call printf
addl $4, %esp
pushl $short
pushl $arg1
call scanf
addl $8, %esp
pushl (short)
pushl $output1
call printf
addl $8, %esp
pushl $input2
call printf
addl $4, %esp
pushl $char
pushl $arg2
call scanf
addl $8, %esp
pushl (char)
pushl $output2
call printf
addl $8, %esp
movl %ebp, %esp
popl %ebp
ret
我想输入short,然后打印,输入char并进行打印,但是相反,在打印'Give char'之后,程序结束,留下了两行空白。有什么想法吗?当我在一个函数调用中获取参数时,它就起作用了。
最佳答案
这是一个直接的C问题,与您的汇编代码无关。您可能应该再次阅读scanf
文档。它只处理任何可以将初始部分转换为数字的部分,其余输入保留在缓冲区中。对于行为良好的输入,这只是终止换行符,但可以是任何内容。然后,与所有其他转换相反,%c
不会自动跳过空格,因此它将很乐意接受缓冲区中的换行符。解决方案:在格式说明符之前显式添加一个空格,使scanf
跳过空白。请注意,您仍然可以在一行上提供输入。如果您不希望这样做,则需要手动丢弃其余的行,或者读取行。