字符串操作和奇数结果

时间:2012-09-02 12:45:52

标签: c++ string visual-studio-2012

首先发帖,所以如果我违反协议我会道歉。

我正在为学校制作一个愚蠢的程序,我有以下代码。

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”之一

  1. 我在即时窗口中使用string.find()度过了一段可怕的时光。我最终得到CXX0047:错误:参数列表与函数不匹配。我根本不懂,因为我在其他地方使用它。

  2. 虽然状况不好对我好。当我给程序一个“v”时,它就像它应该的那样在块内部结束,但是我给它一个“s”,其中cmdCheck应该评估为0,但它给出-1并保持在块内。

  3. 最后,我使用cmdCheck编写了另一个错误,但我在while条件下有这个错误,但它也没有工作。

  4. 我的初学者认为输入缓冲区存在问题,但是当我查看Locals窗口中的userCmd变量时,我有一个大小为1的字符数组。缓冲区中只有字母和垃圾(就我而言)可以告诉)

    我知道我可以绑一堆||与每个命令一起,但在我看来这更优雅。我看了去年的最后一次,我的条件很难看。在这一点上,这更多是一个原则问题。

4 个答案:

答案 0 :(得分:1)

使用字符串中的getline获取输入。

getline (cin, userCommand) ;

如果输入是一个字母,请将其放在一个字母中。如果你坚持把它带进一个字符串,请使用它的第一个索引进行检查。

答案 1 :(得分:1)

我猜测userCommandstd::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将包含用户输入。