編輯:
你的問題是,在C++中,當getline
功能被中斷,你下一步之前,需要手動清除錯誤狀態呼叫。這足以在循環寫:
while (1) {
getline(cin, _input);
if (cin.fail() || cin.eof()) {
cin.clear(); // reset cin state
}
_parse_cmd(_input);
}
但要注意:你還能過濾用CTRL-Break,你可以循環是很難阻止...
TL/DR:下面是我的第一個步驟首先在C語言中使用這個簡單的解決方案,然後在C++中使用這種簡單的解決方案,即只對Ctrl-C進行過濾並在Ctrl-Break上終止。
您可以輕鬆獲得與signal
函數的Ctrl-C截取。
下面是使用的一個示例:
#include <stdio.h>
#include <signal.h>
void ctrl_c(int sig) {
fprintf(stderr, "Ctrl-C caught\n");
signal(sig, ctrl_c); /* re-installs handler */
}
int main() {
char buf[256];
void (*old)(int);
old = signal(SIGINT, ctrl_c); /* installs handler */
for (;;) {
if (fgets(buf, sizeof(buf), stdin) != NULL) {
printf("Got : %s", buf);
}
}
signal(SIGINT, old); /* restore initial handler */
return 0;
}
Ctrl-C鍵被截取,用CTRL-Break殺死該程序。
編輯:
舊的C版本很簡單。在C++中,你必須明確標誌在cin
如果getline
被打斷:
#include <iostream>
#include <string>
#include <csignal>
using namespace std;
void ctrl_c(int sig) {
cerr << "Ctrl-C caught" << endl;
signal(sig, ctrl_c); // re-installs handler
}
int main() {
string buf;
void (*old)(int);
old = signal(SIGINT, ctrl_c); // installs handler
for (;;) {
getline(cin, buf);
if (cin.fail() || cin.eof()) {
cin.clear(); // reset cin state
}
else {
cout << "Got" << buf << endl;
}
}
signal(SIGINT, old); // restore initial handler
return 0;
}
這是正確的,現在C++,即使我不使用特定SetConsoleCtrlHandler
微軟。恕我直言,信號使用如果更簡單,如果只有Ctrl-C必須被捕獲。
什麼是_parse_cmd? – 2014-11-05 16:53:27
@MarcoA。這是一個簡單的命令解析函數,只執行簡單的動作 – manatttta 2014-11-05 16:57:01
爲什麼不禁用'ENABLE_PROCESSED_INPUT'模式,所以CTRL + C被報告爲鍵盤輸入而不是信號? – Sam12345 2014-11-05 17:27:02