• 0

[C++] Implement press any key to continue


Question

How to implement press any key to continue?

The following doesn't work, it requires me to press enter.

void pressAnyKeyToContinue()
{
	cin.sync();
	cout << endl << "Press any key to continue..." << endl;
	cin.get();
}

Neither does getchar(); instead on cin.get();

15 answers to this question

Recommended Posts

  • 0

What platform are you using?

Without implementing some kind of keyboard hook, I think it's only possible on Windows.:

A) system("pause") - which will make people rant about how "slow" and unreliable it is (but you don't give a **** since you just want to end the program)

B) use the _getch function, which is included in conio.h

  • 0

What platform are you using?

Without implementing some kind of keyboard hook, I think it's only possible on Windows:

A) system("pause") - which will make people rant about how "slow" it is (like you give a **** since you just want to end the program)

B) use the _getch function, which is included in conio.h

Getch(); would work great for you. Though "cin" should already be waiting...but I think your problem is that cin.get(); waits for a specific key (Default Enter)

  • 0

Keep your original code, just change the message to "Press ENTER to continue". Both system("pause") and _getch() are Windows-specific; don't introduce that dependency just for the sake of supporting any key (if you already have that dependency, nevermind). In any case, most users press space or enter when prompted for any key.

  • 0

Keep your original code, just change the message to "Press ENTER to continue". Both system("pause") and _getch() are Windows-specific; don't introduce that dependency just for the sake of supporting any key (if you already have that dependency, nevermind). In any case, most users press space or enter when prompted for any key.

Your argument is made ad infinitum on the web, but it simply doesn't address the OP's question. He wants the user to be able to press any key, not the enter key. And I clearly pointed out that those 2 functions were Windows-specific. But if that's the platform he's developing on, then like you mention, it's perfectly fine. If not, then what he's asking is probably not possible without implementing some low-level key-event hook, but I doubt that would be cross-platform so we'd gain nothing there anyway.
  • 0

It's worth considering both. If it's homework or something, it might be best to simply ask the user to press enter, because this can be done in a cross-platform manner.

If you really want the any key thing and this is for Windows, use boogerjones' option B. There is no good reason to call pause, even if the overhead doesn't really matter. _getch() does the same thing. Remember that you probably want to flush stdin before you call it, otherwise you can end up just reading a character that is already in the buffer instead of prompting for a new one.

If it's for another platform, you would have to find out what the equivalent terminal I/O stuff is there.

  • 0

I see.. Well this then is a pretty difficult problem to overcome. Although ultimately it doesn't really matter much that you have a "press any key to continue" sort of function.

Although.. could he perhaps do something like

int main()
{
char c;
//....code.....
//...more code...
cout << "Press any key to continue.\n";
cin >> c;
//..more code
cout << "I dont know why I have so many pauses here...\n";
cin >> c;
//...etc...
}

Something like this. Just create a character to be used in the "pause" mechanism that comes with getting input.

It's not flawless, but you could just disregard the character otherwise. It only takes up one byte, anyway.

It's still not perfect but hey, do what you can.

  • 0

I think this should work:

#include <stdio.h>
#include <unistd.h>
#include <termios.h>

int main()
{
char x = ' ';

printf("Press any key to continue...\n");
x = getch();

printf("The key you entered is: %c \n", x);

return 0;
}

int getch(void)
{
int ch;
struct termios oldt;
struct termios newt;
tcgetattr(STDIN_FILENO, &oldt); /*store old settings */
newt = oldt; /* copy old settings to new settings */
newt.c_lflag &= ~(ICANON | ECHO); /* make one change to old settings in new settings */
tcsetattr(STDIN_FILENO, TCSANOW, &newt); /*apply the new settings immediatly */
ch = getchar(); /* standard getchar call */
tcsetattr(STDIN_FILENO, TCSANOW, &oldt); /*reapply the old settings */
return ch; /*return received char */
}

I found it here: http://ubuntuforums.org/archive/index.php/t-225713.html

  • 0

Something like this. Just create a character to be used in the "pause" mechanism that comes with getting input.

It's not flawless, but you could just disregard the character otherwise. It only takes up one byte, anyway.

It's still not perfect but hey, do what you can.

No, it won't work. It will block at the first cin until you hit enter.

Rudy's code probably will work for the specific platform it's designed for (Linux?), as it's basically an implementation of the Windows _getch().

  • 0

No, it won't work. It will block at the first cin until you hit enter.

Rudy's code probably will work for the specific platform it's designed for (Linux?), as it's basically an implementation of the Windows _getch().

Unfortunately I don't have a c/c++ compiler on my Windows machine at work.... so I can't test it but yes I believe it was written for Linux (but I figured it might work on Windows or give him an idea where to start)

  • 0

Unfortunately I don't have a c/c++ compiler on my Windows machine at work.... so I can't test it but yes I believe it was written for Linux (but I figured it might work on Windows or give him an idea where to start)

It won't, because the Windows console is completely different. Still good to have though, since he didn't specify an OS.

The Windows implementation I described earlier would look like this (in C):

void pause(void)
{
	puts("Press any key to continue...");
	FlushConsoleInputBuffer(GetStdHandle(STD_INPUT_HANDLE));
	_getch();
}

If you wanted it to run on both Windows and Linux, you'd just have to add some #ifdefs.

  • 0
Your argument is made ad infinitum on the web, but it simply doesn't address the OP's question. He wants the user to be able to press any key, not the enter key.
No need to be so picky. I was not trying to contradict you, just propose an alternative - since you did not mention it, did you? ;). While "Press ENTER to continue" is technically not the same as "Press any key to continue", in many cases it achieves almost the same effect while avoiding a dependency on a non-standard C++ feature. Chances are the OP hadn't thought of it and might consider it a worthy solution. Of course your reply did address his point more directly, but since you already had done so, I saw no reason to repeat what you said.

That's all. :)

  • 0

The code needs to be portable, but I can work with the all your responses.

Right, then you have to just ask for enter. There is no portable way to ask for "any" key. It simply doesn't exist. I suppose you could use #ifdefs to add the platform-specific code for the platforms you support and have tested, and then fall back to asking for just enter on all other platforms.

This topic is now closed to further replies.
  • Recently Browsing   0 members

    • No registered users viewing this page.
  • Posts

    • Save 35% on Sony's SS-CS5M2 3-way high-res bookshelf speakers by Taras Buria Sony is currently offering a big discount on its SS-CS5M2 bookshelf speaker, saving you 35% on a set of high-quality audio equipment. The SS-CS5M2 is a passive 3-way bookshelf speaker with a 5.12-inch woofer, a 25 mm soft-dome tweeter, and a 19 mm super tweeter. This design allows different drivers to handle different parts of the sound spectrum for a clearer, more detailed audio when watching movies or listening to music. The compact cabinet size allows you to place these speakers on shelves, desks, or stands, making them a practical choice for apartments, bedrooms, and small living rooms. Despite its compact size, the SS-CS5M2 delivers up to 100 W of power. Note that since the speakers are passive, you will need an amplifier to drive them. However, if you do, you can use them for high-resolution music, thanks to a claimed frequency response of 53 Hz - 50 kHz. It is able to extend so far high in the spectrum as a result of those super tweeters. While they will work with most amplifiers and AV receivers, Sony says this pair is a perfect match for its AV receivers, such as STRDH190, 590, 790, or 1000. Sony CS Bookshelf Speakers SS-CS5M2 3-Way 3-Driver Hi-res - $178 | 36% off on Amazon US This Amazon deal is US-specific and not available in other regions unless specified. This is a first-party seller link (at the time of article publishing); ensure that you also purchase from a first-party seller link only. If you don't like it or want to look at more options, check out the previous deals that we have covered, OR you can also visit Amazon US deals page. Get Prime (SNAP), Prime Video, Audible Plus or Kindle / Music Unlimited. Free for 30 days. As an Amazon Associate, we earn from qualifying purchases.
    • So they somehow expect Apple to easily make it so that if I install say DeepSeek that DS can then handle all the tasks that Siri would be doing while integrated in the OS? That sounds like just rediculous.
    • For ray-tracing, the Radeon RX 9070 XT is better than the GeForce RTX 5070, but worse than the GeForce RTX 5070 Ti The Radeon RX 9070 XT is similar to the GeForce RTX 5070 Ti in rasterization Both AMD and NVIDIA have had serious issues with drivers in the past, so I can't say that one is better or worse than the other. Yes. AMD has better support Linux than does NVIDIA. Use Display Driver Uninstaller (DDU) to uninstall NVIDIA's drivers before installing AMD's drivers. That's up to you. Supplies of memory is unpredictable because AI using up a lot of memory. As a result, there is a lot of volatility in video card prices.
    • Promoting is fine - advertising, informing, whatever.  But interrupting your PAID OS experience is not.
  • Recent Achievements

    • One Month Later
      pinnclepd earned a badge
      One Month Later
    • First Post
      X-No-file earned a badge
      First Post
    • One Month Later
      johnjacobb40 earned a badge
      One Month Later
    • One Year In
      Primer1st earned a badge
      One Year In
    • Experienced
      JayZJay went up a rank
      Experienced
  • Popular Contributors

    1. 1
      +primortal
      510
    2. 2
      PsYcHoKiLLa
      215
    3. 3
      +Edouard
      145
    4. 4
      Steven P.
      88
    5. 5
      ATLien_0
      83
  • Tell a friend

    Love Neowin? Tell a friend!