代码之家  ›  专栏  ›  技术社区  ›  volting

忽略scanf中数据前的回车…用conio.h保留基于控制台的图形布局

  •  2
  • volting  · 技术社区  · 14 年前

    我不幸在VC++6中使用了conio.h来完成大学作业,

    我的问题是我的图形设置在屏幕的中心…

    例如

    gotoxy( getcols()/2, getrows()/2);
    printf("Enter something");
    scanf( "%d", &something );  
    

    现在,如果有人在输入“something”之前不小心点击了enter,那么光标将被重置到下一行屏幕的左侧。

    iv尝试用fflush(stdin)和getchar()刷新键盘和bios缓冲区,这和我预期的一样不起作用!

    如有任何帮助/建议,我们将不胜感激, 谢谢, V

    2 回复  |  直到 14 年前
        1
  •  2
  •   Carl Smotricz    14 年前

    成功之路将包括完成任务要求你做的事情:)特别是,你应该使用 conio.h 阅读你的输入。 scanf() 一个二次函数。

    因为 我懒惰 这是一个家庭作业问题,我不会给你写代码的。

    一种可能是使用 cscanf() 而不是 SCAN() . 但这 可以 (我不知道)回音输入字符,其中包括意外的 进入 而不是解决你的问题。

    如果是这种情况,我的策略是编写一个循环来收集从键盘输入的字符,使用非回音 getch() 功能。在至少有一个可打印字符之前,可以忽略换行符,然后接受字符(并将它们存储在字符数组中或其他地方),直到获得换行符为止。因为输入字符不会被回送,所以我认为光标不会移动。

    然后可以使用扫描输入缓冲区中的输入字符 sscanf() . 您需要对输入字符进行计数,以确保您的用户不会溢出缓冲区。另外,在出现坏数据的情况下,可能会进行一些错误处理。

    编辑: 我忘了提一下:缓冲区中最后一个输入字符后面应该跟一个零字符( '\0' )所以 sSCAN() 将正确终止。默认情况下,缓冲区可能会充满零,但故意将一个零放在其中(例如,当您到达最后一行时),将使代码更加正确和健壮。

        2
  •  3
  •   bta    14 年前

    尝试一次读取一个字符的用户输入。如果检测到前导回车,则忽略字符并运行 gotoxy( getcols()/2, (getrows()/2)+1) 再次编码以将光标重新放置在适当的位置(添加一行以避免写入以前的输出消息)。