2

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

我的问题是我的图形设置在屏幕中央...

例如

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

现在,如果有人在输入“某物”之前不小心按了 Enter,那么光标将重置到下一行屏幕的左侧。

Iv 尝试使用 fflush(stdin) 和 getchar() 刷新键盘和 bios 缓冲区,就像我预期的那样没有用!

任何帮助/想法将不胜感激,谢谢,V

4

2 回答 2

3

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

于 2010-03-15T20:56:16.473 回答
2

通往成功的道路将涉及做作业要求你做的事情:) 特别是,你应该使用一个或多个函数conio.h来阅读你的输入。scanf()不是conio.h函数。

因为我比较懒,这是一道作业题,我就不给你写代码了。

一种可能性是使用cscanf()而不是scanf(). 但这可能(我不知道)回显输入字符,其中包括意外Enter的 ,并且不能解决您的问题。

如果是这种情况,我的策略是编写一个循环来收集从键盘输入的字符,使用非回显getch()函数。您可以忽略换行符,直到您至少有一个可打印字符,然后接受字符(并将它们存储在字符数组或其他任何内容中),直到获得换行符。由于输入字符不会被回显,我认为光标不会移动。

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

编辑:我忘记提及的事情:缓冲区中的最后一个输入字符后面应该跟一个零字符 ( '\0'),这样sscanf()才能正确终止。默认情况下,您的缓冲区可能会充满零,但故意将其放入其中(例如,当您点击最后一个换行符时)将使您的代码更加正确和健壮。

于 2010-03-15T21:01:02.633 回答