我在使用std :: string :: find()时遇到了麻烦。我通过以下代码从控制台读取字符串:
50 while(command.find(exitString) != 0) {
51 std::cout << "$ ";
52 getline(std::cin, command);
53
54 doSwitch(command);
55 }
然后我通过以下功能“切换”它们:
59 void Console::doSwitch(std::string command) {
60 if(command.find(helpString) == 0) {
61 help();
62 } else if(command.find(loadString) == 0) {
63 try {
64 doLoad(command);
65 } catch(std::string str) {
66 std::cout << str << std::endl;
67 }
68 } else if(command.find(dumpProcString) == 0) {
69 try {
70 doDumpProc(command);
71 } catch(std::string str) {
72 std::cout << str << std::endl;
73 }
74 } else if(command.find(dumpMemString) == 0) {
75 doDumpMem();
76 } else if(command.find(defmemString) == 0) {
77 try {
78 doDefmem(command);
79 } catch(std::string str) {
80 std::cout << str << std::endl;
81 } catch(char *str) {
82 std::cout << str << std::endl;
83 }
84 } else if(command.find(resetString) == 0) {
85 try {
86 doReset();
87 } catch(std::string str) {
88 std::cout << str << std::endl;
89 }
90 } else {
91 std::cout << "Comando inválido." << std::endl;
92 }
93 }
但有时它根本无法正确切换。有线索吗?
提前致谢,
编辑: 我已经完成了一些测试,我发现它落在了最后一个else-if语句上,而不是落在最后一个上面。 然后我再次检查了我的代码,发现根本原因是我忘了初始化resetString。 问题解决了! 谢谢大家。
答案 0 :(得分:5)
您可能希望find
在找到字符串时返回零,有点像strcmp
的工作方式。
但这不是find
的工作方式。 find
返回找到的字符串的第一个索引,该索引可能为零,如果您要查找的字符串前面有空格,其他字符串等,则可能是其他索引。
如果find
没有找到您要查找的内容,则会返回string::npos
。所以你的if ... else块应该检查是否找到了找到的字符串,而不是检查它们是否在索引零处。像这样:
if(command.find(helpString) != string::npos ) {
help();
} else if /// ... etc...
答案 1 :(得分:0)
您正在读取一行,然后调用doSwitch()而不检查其exitString。在这种情况下,当输入是exitString时,执行doSwitch()函数结束时的else块,导致程序在退出循环之前打印“Command Invalido”。
这是你观察到的吗?
如果是其他内容,请告诉我们您的代码输入错误的输入以及输入和输出是什么。