我接受用户输入的程序,检查输入是否为空,以及是否匹配字符串向量(因为它是用户名样式的程序)
但是,如果命令是say,/ help或/ commands,我将如何取消检查字符串以查看它是否与向量中的字符串匹配?当然,如果有人输入其中一个命令,我希望不检查它是否是用户名,而是显示帮助主题等。
我正在考虑使用休息时间,但我想要一些帮助,因为我对C ++缺乏经验。到目前为止,这是我的代码的相关部分:
vector <string> unamevec(1,"Administrator"); //Declare vector.
bool isValidUserName(const string& input) { //Check username is in vector
for(int i = 0; i < 1; ++i) {
if(input == unamevec[i]) {
return true;
}
}
return false;
}
int main() {
string userinput;
string accesslevel;
while (userinput.empty()){ //Check for empty input
cout << "Please enter your identity.\n"; //Identify user
getline(cin, userinput);
if (!isValidUserName(userinput)) {
do //Check to see if user is the same as the vector "unamevec"
{
cout << "This user is either non existent or has access privileges revoked.\n"; //Wrong username!
cout << "Please re-enter the username.\n";
getline(cin, userinput);
}
while (!isValidUserName(userinput));
}
}
答案 0 :(得分:2)
使用break解决问题没有错。但就“顶级结构”而言,我将从一点开始......您没有检查输入流状态是否存在文件结尾或错误情况。
考虑如果您的标准输入来自文件而不是终端,可能会发生什么,并且您点击该文件的末尾。不再有输入......包括没有/quit
命令(或其他)。你的循环如何终止?类似地,对于文件输入方案,如果它突然断开连接的网络文件系统会怎么样?
(注意:我建议给予getline and error handling一个直读,作为一篇关于细节的可访问文章。一个常用的方便细节是getline返回你传入的流对象......当出现错误或文件结束时,流可以在false
下表现为布尔if
。如果你不需要在每次循环之前提示,那么用getline本身的结果来有效地控制循环。)
无论如何,为了得到你正在寻找的处理......你可能会尝试类似的东西:
while (true) {
cout << "Please enter the username.\n";
if (not getline(cin, userinput)) {
// eofbit, failbit, or badbit
break;
}
if (isValidUserName(userinput)) {
// do whatever you do with valid user name input
}
else if (isValidCommand(userinput)) {
// do whatever, and break if you have reason to leave the loop
// (such as a /quit command)
}
else {
cout << "Not a valid user or command.\n";
}
}
// Only in case of set badbit we are sure that errno has been set in
// the current context. Use perror() to print error details.
if (cin.bad())
perror("error while reading from standard input");
// decide if cin.eof() represents an error or not, and handle it if so
(注意:您不必使用not
而不是!
,如果您从一开始就学习C ++,那么我会发现它更具可读性与C兼容。我认为or
比||
更具可读性,and
比&&
更具可读性。它们是关键字,您不能将它们用作变量这样的名字......不妨将它们用于某事。:P我的意见。)
正如已经指出的,如果您要使用这样的输入策略,那么用户名不能以'/'开头。设计方面,有很多值得思考......但作为一种学习练习,我会说没事。
还指出:您可能想要使用std::find
。许多集合允许访问所有元素,而无需通过整数索引。有些可以用整数索引,但是如果你不做它们就可以更快地查找。