有没有可能制造出一个现代化的便携式设备;“等待输入”;实施 我通过Visual Studio教C++,我想提供一个便携式的、安全的、现代的系统(“暂停”)< /C>函数。阅读是相当令人沮丧的,因为没有一个答案能提供有效的便携式/现代解决方案

有没有可能制造出一个现代化的便携式设备;“等待输入”;实施 我通过Visual Studio教C++,我想提供一个便携式的、安全的、现代的系统(“暂停”)< /C>函数。阅读是相当令人沮丧的,因为没有一个答案能提供有效的便携式/现代解决方案,c++,C++,常见的建议是:std::cin.get()通常不这样做: 如果以前使用过std::cin,则跳过它。因此需要调用两次才能暂停一次 如果写入两次-之前没有输入-它将暂停两次 如果先前的输入无效,则跳过所有调用std::cin.clear()before无法解决此问题 而max\u keyboard\u latency\u hz是第一个std::cin.ignore()的值(以赫兹为单位)。它在以下情况下正常工作:输入、损坏输入和无输入。问题是极端情况(之前立即按enter键),这取决于硬件(

常见的建议是:
std::cin.get()通常不这样做:

  • 如果以前使用过
    std::cin
    则跳过它。因此需要调用两次才能暂停一次
  • 如果写入两次-之前没有输入-它将暂停两次
  • 如果先前的输入无效,则跳过所有调用
    std::cin.clear()
    before无法解决此问题

max\u keyboard\u latency\u hz
是第一个
std::cin.ignore()的值(以赫兹为单位)。它在以下情况下正常工作:输入、损坏输入和无输入。问题是极端情况(之前立即按enter键),这取决于硬件(性能/输入延迟)。灵活的
max\u keyboard\u latency\u hz
会抵消这一点



我只是想知道是否有一种方法可以使
系统工作(“暂停”)类似于适用于前面三种情况的实现:输入、无输入和损坏的输入。就我的研究而言,还没有这样的解决方案,所以我可能会选择我的实现(这当然不是什么值得高兴的事情)。

我不同意。对于初学者来说,教他们如何正确地使用电脑真是太棒了!!趁他们还年轻的时候去买……没有一个选择是好的。你要么需要使用特定于操作系统的东西,要么一起破解一些只在大部分时间有效的东西。例如,对于final函数,输入缓冲区中可能有多个换行符。如果有的话,你就不会明白了。正如其他人所说,不停顿是一个容易得多的选择。向某人演示如何打开命令窗口/使用调试器并运行代码只需几分钟,这是他们可以掌握的一项有用技能。教初学者使用Visual Studio在main的末尾设置断点。然后教给他们一些使用调试器的基础知识。将流作为实时输入源几乎总是一个难题。它们是小溪!如果你想要一个类似“GUI”的东西,那就做一个GUI:P或cmd行的模仿,就像ncurses或kbhit一样。。。但是你又回到了API特定的事情上,你仍然在做邪恶的事情!
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
#include <iostream>
#include <limits>
#include <chrono>

void system_pause(unsigned max_keyboard_latency_hz = 50'000u) {
    std::cout << "press enter to continue . . . ";
    if (!std::cin.good()) {
        std::cin.clear();
    }
    auto t1 = std::chrono::high_resolution_clock::now();
    std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
    auto t2 = std::chrono::high_resolution_clock::now();

    double delta_t = std::chrono::duration_cast<std::chrono::nanoseconds>(t2 - t1).count() / 1e9;
    if (delta_t < 1.0 / max_keyboard_latency_hz) {
        std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
    }
}