对于其他人发现这个问题,可以使用conio.h库中的kbhit()函数来完成。只需插入!kbhit()我将SOMETHING置于正确的循环中,但是我正在寻找一种方法来实现这一点而不需要库。
我是初学者,试图在控制台中创建一个简单的动画。动画将在控制台右侧显示UP字样,右侧显示DOWN字样。到目前为止,我已经让动画完成了一次这样的迭代,但是我试图让它重复,看起来文本回到顶部或底部并再次进行,直到用户按下输入密钥。
我的书(我从教科书中自学)使得它看起来除了iostream和windows.h之外没有任何特定的库可能,但是包括库函数在内的帮助也是受欢迎的,这是一次学习后的经历所有。万分感谢!
对代码的一点解释是我设置UP和DOWN起始位置的坐标,然后移动光标,用空格删除它所在的前一行,然后递增两个并放一个新单词。我猜我可以使用第二个while循环以某种方式检查是否按下了ENTER键。
#include <iostream>
#include <bitset>
#include <unordered_set>
/* Count the number of 1 bits in 32 bit int x in 21 instructions.
* From /Hackers Delight/ by Henry S. Warren, Jr., 5-2
*/
int count1Bits(int x) {
x = x - ((x >> 1) & 0x55555555);
x = (x & 0x33333333) + ((x >> 2) & 0x33333333);
x = (x + (x >> 4)) & 0x0F0F0F0F;
x = x + (x >> 8);
x = x + (x >> 16);
return x & 0x0000003F;
}
int main () {
const int n = 19;
const int h = 10;
std::unordered_set<long> dotProductSet;
// look at all 2^(n+h-1) possibilities for longVec
// upper n bits cannot be all 0 so we can start with 1 in pos h
for (int longVec = (1 << (h-1)); longVec < (1 << (n+h-1)); ++longVec) {
dotProductSet.clear();
bool good = true;
// now look at all n digit non-zero shortVecs
for (int shortVec = 1; shortVec < (1 << n); ++shortVec) {
// longVec dot products with shifted shortVecs generates h results
// each between 0 and n inclusive, can encode as h digit number in
// base n+1, up to (n+1)^h = 20^10 approx 13 digits, need long
long dotProduct = 0;
// encode h dot products of shifted shortVec with longVec
// as base n+1 integer
for(int startShort = 0; startShort < h; ++startShort) {
int shortVecShifted = shortVec << startShort;
dotProduct *= n+1;
dotProduct += count1Bits(longVec & shortVecShifted);
}
auto ret = dotProductSet.insert(dotProduct);
if (!ret.second) {
good = false;
break;
}
}
if (good) {
std::cout << std::bitset<(n+h-1)>(longVec) << std::endl;
break;
}
}
return 0;
}
答案 0 :(得分:0)
最好的办法是创建一个自定义的“GetAsyncKeyState”函数,该函数将使用#IFDEF for windows和linux来选择合适的GetAsyncKeyState()或等效函数。对于前
if (GetAsyncKeyState(VK_RETURN))
{
exit = true;
}