当我进入开始然后程序输出else功能,即使我符合标准,我已尝试使用&&同样,它仍然无法正常工作。任何答案都将不胜感激。
#include <iostream>
#include <string>
#include <windows.h>
using namespace std;
int main ()
{
float timer;
bool end;
std::string input;
end = false;
cout << "Enter start then a number to count down from" << ".\n";
while (end == false){
cin >> input;
if (input.find("end" || "End") != std::string::npos)
end = true;
else if (input.find("start" || "restart" || "Start" || "Restart") != std::string::npos)
{
cin >> timer;
while (timer>0){
timer -= 0.1;
Sleep(100);
cout << timer << ".\n";
}
cout << "Finished! Enter restart then another number to perform another countdown, or enter end to close the program" << ".\n";
}
else
cout << "Enter start" << ".\n";
}
return 0;
}
答案 0 :(得分:4)
替换
if (input.find("end" || "End") != std::string::npos)
使用:
if (input.find("end") != std::string::npos || input.find("End") != std::string::npos)
与您的其他if
类似。
你的表达意味着什么似乎很明显,但是当你把它分解时它真的没有意义。 find
需要一个字符串,"end" || "End"
不是字符串。
答案 1 :(得分:2)
逻辑或运算符,||
仅适用于布尔表达式。
例如,如果你有
bool A = true
bool B = false
bool C = A||B;
比您将bool C
设置为True
。它只需要2个布尔值,如果其中任何一个布尔值为真,则返回true。这都是合乎逻辑的或确实如此。
您可能想尝试类似
的内容if (input.find("end") != std::string::npos || input.find("End") != std::string::npos)
答案 2 :(得分:1)
||
仅适用于逻辑布尔表达式。
从标准(重点是我的):
5.15逻辑OR运算符[expr.log.or]
||
运算符组从左到右。 操作数在上下文中都转换为bool
(第4条)。如果其任一操作数为true
,则返回true
,否则返回false
。
因此在input.find("end" || "End")
中,它会尝试将"end"
和"End"
转换为bool
。运营商||
也会返回bool
。
这里要解决您需要更换的问题:
if (input.find("end" || "End") != std::string::npos)
通过
if ( input.find("End") != std::string::npos ||
input.find("End") != std::string::npos )
并在第二个find
中执行相同操作。
答案 3 :(得分:1)
C ++根本不起作用。当你写
input.find("end" || "End") != std::string::npos
编译器会看到逻辑或两个非空的const char指针,这会产生布尔值true
。然后将其解释为char
,其值为1
('\1'
),然后在字符串中搜索 - 当然不是您的意图。如果您想知道string是否在一组字符串中,您可以使用:
static std::set<std::string> s = { "end", "End" };
s.find( input ) != s.end();
虽然可能不是世界上最有效的代码,但是使用C ++ 11编译器,你也可以将它压缩成一行,如下所示:
if( std::set<std::string>{ "end", "End" }.count( input ) ) {
// found...
}
答案 4 :(得分:0)
if (input.find("end" || "End") != std::string::npos) // ^^^^^^^^^^^^^^
此处未正确使用||
运算符。右边的表达式将返回true,因为它不为零,然后返回它。所以声明解析为input.find("end")
。您需要在那里使用两个单独的条件语句:
if (input.find("end") != std::string::npos || input.find("End") != std::string::npos)
答案 5 :(得分:0)
我建议使用正则表达式来代替这样的事情: regex
答案 6 :(得分:0)
函数调用的参数
input.find("end" || "End")
具有bool类型,表示字符串文字“end”或/和字符串文字“End”的地址的addess不等于零。很明显,两个字符串文字都有不等于零的地址。所以这个电话相当于
input.find(true)
编译器找到一个最适合此参数的重载函数find。这个功能是
find(charT,c,size_tipe pos = 0);
值true被隐式转换为值charT(1),函数尝试在字符串中查找值为1的char。
答案 7 :(得分:0)
有一个解决方法:
#include <iostream>
#include <string>
#include <windows.h>
using namespace std;
int main()
{
float timer;
bool end;
std::string input;
end = false;
cout << "Enter start then a number to count down from" << ".\n";
while (end == false) {
cin >> input;
if (input.find("end") != std::string::npos | input.find("End") != std::string::npos)
end = true;
else if (input.find("start") != std::string::npos | input.find("Start") != std::string::npos | input.find("restart") != std::string::npos | input.find("Restart") != std::string::npos)
{
cin >> timer;
while (timer > 0) {
timer -= 0.1;
Sleep(100);
cout << timer << ".\n";
}
cout << "Finished! Enter restart then another number to perform another countdown, or enter end to close the program" << ".\n";
}
else
cout << "Enter start" << ".\n";
}
return 0;
}
应该像这样的if (input.find("end") != std::string::npos | input.find("End")!= std::string::npos
或if (input.find("end") != std::string::npos || input.find("End")!= std::string::npos
而不是if (input.find("end" || "End") != std::string::npos)
一样,您可以使用逻辑或按位或。