1

第一次发帖,如果我违反协议,我深表歉意。

我正在为学校制定一个愚蠢的计划,我有以下代码。

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. while 条件对我不好。当我给程序一个“v”时,它会像它应该的那样在块内结束,但是我给它一个“s”,其中 cmdCheck 应该评估为 0,但它给出一个 -1 并留在块内。

  3. 最后,我用 cmdCheck 编写了另一个错误,但我在 while 条件下遇到了这个错误,它也不起作用。while(userCommand.find("secq") < 0 ...

我最初的想法是输入缓冲区有问题,但是当我在 Locals 窗口中查看 userCmd 变量时,我有一个大小为 1 的字符数组。缓冲区中只有字母,没有垃圾(据我所知)

我知道我可以绑一堆|| 与每个命令一起,但在我看来这更优雅一些。我看了我去年的期末考试,我的条件很丑。在这一点上,这更像是一个原则问题。

4

4 回答 4

1

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

getline (cin, userCommand) ;

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

于 2012-09-02T12:50:23.293 回答
1

我猜那userCommand是一个std::string. 由于该命令应该是单个字符,因此请使用 achar而不是字符串。然后只需将该值用作switch语句中的参数,并为有效字符提供适当的default大小写和给出错误消息的大小写。

于 2012-09-02T12:50:26.977 回答
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. 这可能是一个typedefforint但也可能是typedef一个不同的整数类型。find()如果找不到要传递的字符串,std::string::npos则返回。这个常数的确切值也没有定义,所以你最好与这个常数进行比较,而不是做任何假设。

于 2012-09-02T13:02:49.947 回答
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将包含用户输入。

于 2012-09-02T13:02:14.420 回答