Saya mencoba menulis program C ++ di mana ketika pengguna memasukkan karakter apa pun dari keyboard dan itu harus pindah ke baris kode berikutnya.
Ini kode saya:
char c;
cin>>c;
cout<<"Something"<<endl;
tetapi ini tidak berhasil, karena hanya pindah ke baris berikutnya ketika saya memasukkan beberapa karakter lalu menekan ENTER.
ATAU
Jika saya menggunakan ini
cin.get() or cin.get(c)
itu pindah ke baris instruksi berikutnya ketika saya menekan Enter.
Tapi saya ingin pindah ke baris berikutnya pada sembarang tombol yang ditekan di keyboard, bagaimana ini bisa dilakukan?
Jawaban:
Di Windows:
system("pause");
dan di Mac dan Linux:
system("read");
akan menampilkan "Tekan sembarang tombol untuk melanjutkan ..." dan tentu saja, tunggu tombol apa saja untuk ditekan. Saya harap itu yang Anda maksud
sumber
system
memanggil program eksternal. Anda tidak perlu memanggil program eksternal untuk menunggu tombol apa pun! Ini seperti memanggil orang lain untuk menyalakan komputer Anda ketika Anda duduk di depannya - ini adalah solusi yang lambat.Jika Anda menggunakan Windows, Anda dapat menggunakan
kbhit()
yang merupakan bagian dari pustaka run-time Microsoft. Jika Anda menggunakan Linux, Anda dapat mengimplementasikan sebagaikbhit
berikut ( sumber ):#include <stdio.h> #include <termios.h> #include <unistd.h> #include <fcntl.h> int kbhit(void) { struct termios oldt, newt; int ch; int oldf; tcgetattr(STDIN_FILENO, &oldt); newt = oldt; newt.c_lflag &= ~(ICANON | ECHO); tcsetattr(STDIN_FILENO, TCSANOW, &newt); oldf = fcntl(STDIN_FILENO, F_GETFL, 0); fcntl(STDIN_FILENO, F_SETFL, oldf | O_NONBLOCK); ch = getchar(); tcsetattr(STDIN_FILENO, TCSANOW, &oldt); fcntl(STDIN_FILENO, F_SETFL, oldf); if(ch != EOF) { ungetc(ch, stdin); return 1; } return 0; }
Pembaruan: Fungsi di atas berfungsi di OS X (setidaknya, di OS X 10.5.8 - Leopard, jadi saya berharap ini berfungsi pada versi OS X yang lebih baru). Inti ini dapat disimpan sebagai
kbhit.c
dan dikompilasi di Linux dan OS X denganSaat dijalankan dengan
Ini meminta Anda untuk menekan tombol, dan keluar saat Anda menekan tombol (tidak terbatas pada Enter atau tombol yang dapat dicetak).
@Johnsyweb - uraikan apa yang Anda maksud dengan "jawaban kanonis terperinci" dan "semua masalah". Juga, "lintas-platform": Dengan implementasi ini,
kbhit()
Anda dapat memiliki fungsi yang sama dalam program C ++ di Linux / Unix / OS X / Windows - platform lain mana yang mungkin Anda rujuk?Pembaruan lebih lanjut untuk @Johnsyweb: Aplikasi C ++ tidak tinggal di lingkungan C ++ yang tertutup rapat. Alasan utama keberhasilan C ++ adalah interoperabilitas dengan C. Semua platform utama diimplementasikan dengan antarmuka C (meskipun implementasi internal menggunakan C ++) sehingga pembicaraan Anda tentang "warisan" tampaknya tidak pada tempatnya. Plus, karena kita berbicara tentang satu fungsi, mengapa Anda membutuhkan C ++ untuk ini ("C dengan kelas")? Seperti yang saya tunjukkan, Anda dapat menulis dalam C ++ dan mengakses fungsionalitas ini dengan mudah, dan pengguna aplikasi Anda tidak peduli bagaimana Anda menerapkannya.
sumber
kbhit()
Fungsi Anda mendeklarasikanterminal_settings
variabel dalam satu baris yang tampaknya tidak melakukan apa-apa, namun melakukan segalanya. Beberapa orang mungkin berpikir itu rapi, tetapi saya merasa tidak jelas sampai tidak terbaca.Tidak ada solusi yang sepenuhnya portabel.
Pertanyaan 19.1 di FAQ comp.lang.c membahas hal ini secara mendalam, dengan solusi untuk Windows, sistem mirip Unix, dan bahkan MS-DOS dan VMS.
Ringkasan cepat dan tidak lengkap:
curses
perpustakaan; panggilancbreak()
diikuti olehgetch()
(jangan bingung dengangetch()
fungsi khusus Windows ). Perhatikan bahwacurses
umumnya mengambil kendali terminal, jadi ini mungkin berlebihan.ioctl()
untuk memanipulasi pengaturan terminal.tcgetattr()
dantcsetattr()
mungkin merupakan solusi yang lebih baik.system()
untuk menjalankanstty
perintah.getch()
ataugetche()
.SMG$
rutinitas Manajemen Layar ( ) mungkin berhasil.Semua solusi C ini harus bekerja sama baiknya di C ++; Saya tidak tahu ada solusi khusus C ++.
sumber
Untuk mencapai fungsionalitas ini, Anda dapat menggunakan pustaka ncurses yang diimplementasikan pada Windows dan Linux (dan MacOS sejauh yang saya tahu).
sumber
Di windows, program singkat ini mencapai tujuan:
getch
menjeda konsol sampai tombol ditekan ( https://www.geeksforgeeks.org/difference-getchar-getch-getc-getche/ )#include<iostream.h> #include<conio.h> using namespace std; void check() { char chk; int j; cout<<"\n\nPress any key to continue..."; chk=getch(); j=chk; for(int i=1;i<=256;i++) if(i==j) break; clrscr(); } void main() { clrscr(); check(); cout<<"\n\nIt works!"; getch(); }
Perlu dicatat bahwa getch bukan bagian dari pustaka standar.
sumber
getch()
perbedaannya daricin.get
ataucin>>
, mungkin beberapa tautan ke dokumentasiSaya mencari tahu apa yang ingin Anda capai, karena saya ingat saya ingin melakukan hal yang sama. Terinspirasi oleh Vinay, saya menulis sesuatu yang berhasil untuk saya dan saya agak mengerti. Tapi saya bukan ahli, jadi harap berhati-hati.
Saya tidak tahu bagaimana Vinay tahu Anda menggunakan Mac OS X. Tapi seharusnya bekerja seperti ini dengan kebanyakan OS yang mirip unix. Sangat membantu karena sumber dayanya adalah opengroup.org
Pastikan untuk membersihkan buffer sebelum menggunakan fungsi tersebut.
#include <stdio.h> #include <termios.h> //termios, TCSANOW, ECHO, ICANON #include <unistd.h> //STDIN_FILENO void pressKey() { //the struct termios stores all kinds of flags which can manipulate the I/O Interface //I have an old one to save the old settings and a new static struct termios oldt, newt; printf("Press key to continue....\n"); //tcgetattr gets the parameters of the current terminal //STDIN_FILENO will tell tcgetattr that it should write the settings // of stdin to oldt tcgetattr( STDIN_FILENO, &oldt); //now the settings will be copied newt = oldt; //two of the c_lflag will be turned off //ECHO which is responsible for displaying the input of the user in the terminal //ICANON is the essential one! Normally this takes care that one line at a time will be processed //that means it will return if it sees a "\n" or an EOF or an EOL newt.c_lflag &= ~(ICANON | ECHO ); //Those new settings will be set to STDIN //TCSANOW tells tcsetattr to change attributes immediately. tcsetattr( STDIN_FILENO, TCSANOW, &newt); //now the char wil be requested getchar(); //the old settings will be written back to STDIN tcsetattr( STDIN_FILENO, TCSANOW, &oldt); } int main(void) { pressKey(); printf("END\n"); return 0; }
O_NONBLOCK sepertinya juga merupakan flag yang penting, tapi tidak mengubah apapun untuk saya.
Saya menghargai jika orang-orang dengan pengetahuan yang lebih dalam akan mengomentari ini dan memberikan beberapa nasihat.
sumber
Anda dapat menggunakan fungsi khusus Microsoft _getch :
#include <iostream> #include <conio.h> // ... // ... // ... cout << "Press any key to continue..." << endl; _getch(); cout << "Something" << endl;
sumber
Ini bekerja pada Platform Windows: Menggunakan register Mikroprosesor secara langsung dan dapat digunakan untuk memeriksa penekanan tombol atau tombol mouse
#include<stdio.h> #include<conio.h> #include<dos.h> void main() { clrscr(); union REGS in,out; in.h.ah=0x00; printf("Press any key : "); int86(0x16,&in,&out); printf("Ascii : %d\n",out.h.al); char ch = out.h.al; printf("Charcter Pressed : %c",&ch); printf("Scan code : %d",out.h.ah); getch(); }
sumber
Jika Anda menggunakan Visual Studio 2012 atau yang lebih lama, gunakan
getch()
fungsi tersebut, jika Anda menggunakan Visual Studio 2013 atau yang lebih baru, gunakan_getch()
. Anda harus menggunakan#include <conio.h>
. Contoh:#include <iostream> #include <conio.h> int main() { std::cout << "Press any key to continue. . .\n"; _getch(); //Or getch() }
sumber
Anda bisa menggunakan rutinitas getchar .
Dari tautan di atas:
/* getchar example : typewriter */ #include <stdio.h> int main () { char c; puts ("Enter text. Include a dot ('.') in a sentence to exit:"); do { c=getchar(); putchar (c); } while (c != '.'); return 0; }
sumber
Anda juga bisa menggunakan getch () dari conio.h. Seperti ini:
...includes, defines etc void main() { //operator getch(); //now this function is waiting for any key press. When you have pressed its just //finish and next line of code will be called }
Jadi, karena UNIX tidak memiliki conio.h, kita dapat mensimulasikan getch () dengan kode ini (tetapi kode ini sudah ditulis oleh Vinary, my fail):
#include <stdio.h> #include <termios.h> #include <unistd.h> int mygetch( ) { struct termios oldt, newt; int ch; tcgetattr( STDIN_FILENO, &oldt ); newt = oldt; newt.c_lflag &= ~( ICANON | ECHO ); tcsetattr( STDIN_FILENO, TCSANOW, &newt ); ch = getchar(); tcsetattr( STDIN_FILENO, TCSANOW, &oldt ); return ch; }
sumber
Opsi lainnya adalah menggunakan utas dengan penunjuk fungsi :
#include <iostream> #include <thread> // this_thread::sleep_for() and thread objects #include <chrono> // chrono::milliseconds() bool stopWaitingFlag = false; void delayms(int millisecondsToSleep) { std::this_thread::sleep_for(std::chrono::milliseconds(millisecondsToSleep)); } void WaitForKey() { while (stopWaitingFlag == false) { std::cout<<"Display from the thread function"<<std::endl; delayms(1000); } } int main() { std::thread threadObj(&WaitForKey); char userInput = '\0'; while (userInput != 'y') { std::cout << "\e[1;31mWaiting for a key, Enter 'y' for yes\e[0m" << std::endl; std::cin >> userInput; if (userInput == 'y') { stopWaitingFlag = true; } } if (threadObj.joinable()) threadObj.join(); std::cout<<"Exit of Main function"<<std::endl; return 0; }
sumber
Jika Anda mencari fungsi kbhit () di MSDN sekarang, dikatakan bahwa fungsi tersebut tidak digunakan lagi. Gunakan _kbhit () sebagai gantinya.
#include <conio.h> int main() { _kbhit(); return 0; }
sumber
#include <iostream> using namespace std; int main () { bool boolean; boolean = true; if (boolean == true) { cout << "press any key to continue"; cin >> boolean; } return 0; }
sumber
Cukup gunakan
system("pause");
perintah.Semua jawaban lain memperumit masalah.
sumber