在我的程序中,我要求用户通过getline输入,然后在一个单独的类中,将字符串拆分为三个不同的字符串,然后我将通过预定值列表进行检查。
现在的工作方式,如果有人输入无效命令,我会显示" INVALID"
我遇到的问题是字符串只包含空格或只包含一个换行符。
以下是我要做的事情:
std::string command; // command user enters
getline(std::cin, command); // user input here
std::string tempCheck; // if we have a value in here other than empty, invalid
// use istringstream to grab the words, max of 3
std::istringstream parse{fullCommand}; // parse command into words
if(fullCommand.empty()){ // nothing has been input
std::cout << "INVALID" << std::endl;
return;
}
parse >> command; // stores first word (the command)
parse >> actionOne; // stores second word as parameter
parse >> actionTwo; // stores third word as parameter
parse >> tempCheck;
if(!tempCheck.empty()) {
std::cout << "INVALID" << std::endl;
return;
}
变量tempCheck基本上意味着如果它超过三个单词(我想要的命令限制),那么它就是INVALID。我还认为有一个空字符串可以工作,但是当没有任何输入时它只会在无限循环中结束,但我只是按下回车。
这是我期望我的输入做的(粗体输出):
CREATE username password
**CREATED**
LOGIN username password
**SUCCEEDED**
ASDF lol lol
**INVALID**
**INVALID**
REMOVE username
**REMOVED**
**INVALID**
QUIT
**GOODBYE**
以下是发生的事情:
CREATE username password
**CREATED**
// newline entered here
它进入了一个看似无限的循环。我仍然可以输入东西,然而,它们并没有真正影响任何东西。例如,输入QUIT什么都不做。但是,如果我重新开始我的程序并输入&#34; QUIT&#34;在不尝试仅使用换行符或仅使用空格的情况下,我得到了预期的输出:
QUIT
**GOODBYE**
那么,如何告诉getline或我的istringstream,如果用户只输入一堆空格然后点击进入,或者如果用户只是点击进入,则显示无效并返回?无论如何只需使用getline或istringstream吗?
答案 0 :(得分:0)
Alex,以下代码可能会有所帮助:
std::string strip(std::string const& s, std::string const& white=" \t\n")
{
std::string::size_type const first = s.find_first_not_of(white);
return (first == std::string::npos)
? std::string()
: s.substr(first, s.find_last_not_of(white)-first+1);
}
您可以在创建istringstream
之前应用它:
std::istringstream parse{strip(fullCommand)};
以上代码是从the old well-known technique借用并稍加修改的。