输入缓冲区保留旧输入,尽管 FlushConsoleInputBuffer MASM



我写了一个处理数组的程序,我需要检查输入的正确性。如果您与数字和字母一起输入,则输入命令会循环并且不允许您输入数据,我决定在每次输入之前清理缓冲区,但问题仍然存在

S1:invoke   WriteConsole, h_output, ADDR ComSizeMas, Len_ComSize, ADDR nWrite, 0 
   invoke FlushConsoleInputBuffer,h_input
   invoke      crt_scanf,  ADDR format_size_buf, ADDR Size_buf     
   CMP Size_buf,1
   JL S1
   CMP Size_buf,100
   JG S1
scanf[_s]将数据

读取到内部CRT缓冲区。 调用FlushConsoleInputBuffer对其没有影响。 相反,我们需要在 stdin 流上调用 fflush

如果流已打开供输入,则 fflush 会清除 缓冲区

所以在 C/C++ 代码中,我们需要调用fflush(__iob_func())

演示示例 C/C++

ULONG __cdecl GetNumberc()
{
    ULONG n;
    while (!scanf_s("%u", &n))
    {
        if (fflush(__iob_func())) break;
        printf("invalid numbern");
    }
    return n;
}

对于 x86 ASM

extern __imp__fflush : DWORD, 
       __imp____iob_func : DWORD, 
       __imp__scanf_s : DWORD,
       __imp__printf : DWORD
.const
format_number DB "%u",0
invalid_number DB "invalid number",10,0
.code
_GetNumber proc
    sub esp,4
@@0:
    push esp
    push offset format_number
    call __imp__scanf_s
    add esp,8
    test eax,eax
    jnz @@1
    call __imp____iob_func
    push eax
    call __imp__fflush
    add esp,4
    test eax,eax
    jnz @@1
    push offset invalid_number
    call __imp__printf
    add esp,4
    jmp @@0
@@1:
    mov eax,[esp]
    add esp,4
    ret
_GetNumber endp

对于 x64 ASM

extern __imp_fflush : QWORD, 
       __imp___iob_func : QWORD, 
       __imp_scanf_s : QWORD,
       __imp_printf : QWORD
.const
format_number DB "%u",0
invalid_number DB "invalid number",10,0
.code
GetNumber proc
    sub rsp,28h
@@0:
    lea rdx,[rsp+30h]
    lea rcx,format_number
    call __imp_scanf_s
    test eax,eax
    jnz @@1
    call __imp___iob_func
    mov rcx,rax
    call __imp_fflush
    test eax,eax
    jnz @@1
    lea rcx,invalid_number
    call __imp_printf
    jmp @@0
@@1:
    mov eax,[rsp+30h]
    add rsp,28h
    ret
GetNumber endp

相关内容

  • 没有找到相关文章

最新更新