让不同的输入做不同的事情?

时间:2014-07-19 11:24:57

标签: c++ vector

我接受用户输入的程序,检查输入是否为空,以及是否匹配字符串向量(因为它是用户名样式的程序)

但是,如果命令是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));
    }
}

1 个答案:

答案 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。许多集合允许访问所有元素,而无需通过整数索引。有些可以用整数索引,但是如果你不做它们就可以更快地查找。