作为一个C++初学者,我经常遇到这样一个问题:在利用Visual Studio调试程序时,程序运行完成后无法保留cmd屏幕而无法查看运行的结果。
网上有一种简便的处理方法,即在程序的末尾加上一句cin.get(),通过强行多读取一个字符的方式,来实现驻屏。但是,这种方法并不总是奏效。当程序中多次输出过字符串,且字符串中含有换行符时,程序末尾的cin.get()似乎在读取之前换行时的换行符,或者换行符之后的某个字符(没有完全搞清楚机制)。在这种情况下,如果使用cin.get(),往往需要多加几个cin.get()才能实现驻屏,而如果前面的程序里有不特定次数的字符串输出,那么尝试用这种方式驻屏就会失败了。
于是在学习了string类之后,想到一个办法,能够实现如下的功能:
1. 在程序末尾处显示提示句:Press Q or q key to quit...
2. 允许操作者输入的一行字符,并读取这一行字符;
3. 检验这一行字符里是否出现过Q或者q,如果出现了,则退出,否则保持屏幕并重新输出提示句。
虽然这个功能只对初学者调试程序有用,却也着实有点意思,在此记录:
// NewQuit.cpp -- Try New String Processing
#include <iostream>
#include <string>
using std::cin;
using std::cout;
using std::endl;
using std::string;
using std::getline;
int main()
{
string exitflag("\n");
cout << "Try New Quit Processing. Start Test..." << endl;
cout << "Press Q or q key to quit..." << endl;
getline(cin,exitflag);
while (exitflag.find('q') == string::npos && exitflag.find('Q') == string::npos)
{
cout << "Press Q or q key to quit..." << endl;
getline(cin, exitflag);
}
return 0;
}
通过getline保证读到的是用户在提示语句之后输出的行,通过find在行字符中寻找是否存在Q或q字符。
其中string::npos是当find函数没有找到相应字符之后的输出,程序中的逻辑即为如果没有找到相应的Q或q字符则一直循环提示过程。