c++ - 字符串操作和奇怪的结果

标签 c++ string visual-studio-2012

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

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

<pre><code>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"); } </code></pre>

这是在驱动一个菜单,我正在尝试验证输入。它应该是一个字母,并且是以下“secq”之一

  1. 我在立即窗口中使用 string.find() 时遇到了麻烦。我最终得到 CXX0047:错误:参数列表与函数不匹配。我根本不明白,因为我在其他地方使用它。

  2. while 条件对我不好。当我给程序一个“v”时,它会像它应该的那样在 block 内结束,但随后我给它一个“s”,其中 cmdCheck 应该评估为 0,但它给出 -1 并留在 block 内。

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

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

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

最佳答案

表达式 userCommand.find("secq") 试图在 userCommand 中找到字符串 "secq"。从它的声音来看,你实际上想要做完全相反的事情,即在字符串 "secq" 中找到 userCommand:

std::string::size_type cmdCheck = std::string("secq").find(userCommand);
while (cmdCheck == std::string::npos) {
    ...
}

另请注意,std::string 不会返回 int。相反,它返回一个 std::string::size_type。这可能是 inttypedef,但它也可能是不同整数类型的 typedef。如果找不到传递给 find() 的字符串,则返回 std::string::npos。此常量的确切值也未定义,因此您最好与此常量进行比较,而不是做出任何假设。

关于c++ - 字符串操作和奇怪的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12236068/

相关文章:

visual-studio-2012 - 如何设置 MS Test 项目的工作目录

c++ - 来自 CreateWindow/CreateDialog 的 HWND 可以从另一个线程获取消息吗?

c++ - 当没有显式关键字与单参数构造函数一起使用时,编译器可以发出警告吗?

c++ - VS2012 SP1(+11 月包)未知类型错误(如 C::a(T &&...) )

r - 如何将单词中的字符重复限制为 2?

ruby - 我怎样才能拆分字符串并保留空格呢?

c# - 使用 Visual Studio 2012 Bundling 时如何正确设置相对 CSS 路径?

c++ - 如何清除为 C++ 中的指针正确指向的数组分配的内存?

c++ - 我应该使用 Boost.GIL 还是它已经死了?

c - 我想将字符串从文件复制到变量二维字符中