首先发帖,所以如果我违反协议我会道歉。
我正在为学校制作一个愚蠢的程序,我有以下代码。
cout << "//Dictionary Program//\n\n";
cout << "Enter a command:\n's' - to search for a pattern at the beginning\n";
cout << "'e' - to search for a pattern at the end\n";
cout << "'c' - to search for a pattern anywhere in the word\n";
//Gather user input.
cout << "Please enter a command ('q' to quit): ";
cin >> userCommand;
cmdCheck = userCommand.find("secq");
while(cmdCheck < 0 || userCommand.length() > 1){
cout << "Please enter a valid command\n";
cin >> userCommand;
cmdCheck = userCommand.find("secq");
}
cout << "//Dictionary Program//\n\n";
cout << "Enter a command:\n's' - to search for a pattern at the beginning\n";
cout << "'e' - to search for a pattern at the end\n";
cout << "'c' - to search for a pattern anywhere in the word\n";
//Gather user input.
cout << "Please enter a command ('q' to quit): ";
cin >> userCommand;
cmdCheck = userCommand.find("secq");
while(cmdCheck < 0 || userCommand.length() > 1){
cout << "Please enter a valid command\n";
cin >> userCommand;
cmdCheck = userCommand.find("secq");
}
这是推动菜单,我正在尝试验证输入。它应该是一个字母,以及以下“secq”之一
我在即时窗口中使用string.find()度过了一段可怕的时光。我最终得到CXX0047:错误:参数列表与函数不匹配。我根本不懂,因为我在其他地方使用它。
虽然状况不好对我好。当我给程序一个“v”时,它就像它应该的那样在块内部结束,但是我给它一个“s”,其中cmdCheck应该评估为0,但它给出-1并保持在块内。
最后,我使用cmdCheck编写了另一个错误,但我在while条件下有这个错误,但它也没有工作。
我的初学者认为输入缓冲区存在问题,但是当我查看Locals窗口中的userCmd变量时,我有一个大小为1的字符数组。缓冲区中只有字母和垃圾(就我而言)可以告诉)
我知道我可以绑一堆||与每个命令一起,但在我看来这更优雅。我看了去年的最后一次,我的条件很难看。在这一点上,这更多是一个原则问题。
答案 0 :(得分:1)
使用字符串中的getline获取输入。
getline (cin, userCommand) ;
如果输入是一个字母,请将其放在一个字母中。如果你坚持把它带进一个字符串,请使用它的第一个索引进行检查。
答案 1 :(得分:1)
我猜测userCommand
是std::string
。由于该命令应该是单个字符,因此请使用char
而不是字符串。然后在switch
语句中使用该值作为参数,并使用适当的有效字符和default
的情况来提供错误消息。
答案 2 :(得分:1)
表达式userCommand.find("secq")
尝试在"secq"
中找到字符串userCommand
。从它的声音来看,你实际上想要完全相反,即在字符串userCommand
中找到"secq"
:
std::string::size_type cmdCheck = std::string("secq").find(userCommand);
while (cmdCheck == std::string::npos) {
...
}
另请注意,std::string
不会返回int
。而是返回std::string::size_type
。对于typedef
,这可能是int
,但对于不同的整数类型,它也可能是typedef
。如果找不到传递给find()
的字符串,则返回std::string::npos
。这个常量的确切值也没有定义,所以你最好不要比这个常数而不做任何假设。
答案 3 :(得分:0)
这样的循环可能更合适:
char result;
std::cout << "Your command: ";
for (std::string line; ; )
{
if (!(std::getline(std::cin, line))
{
std::cerr << "Fatal error: Unexpected end of input!\n";
std::exit(1);
}
if (line.size() == 1 && line.find_first_of("secq") == 0)
{
result = line[0];
break;
}
std::cout << "Sorry, I did not understand. Please say again: ";
}
std::cout << "Thank you! You said, '" << result << "'\n";
现在,如果循环中断,result
将包含用户输入。