0

当我输入 start 时,即使我满足条件,程序也会输出 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;
}
4

8 回答 8

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"不是一个字符串。

于 2013-10-30T18:19:55.600 回答
2

逻辑或运算符,||仅适用于布尔表达式。

例如,如果你有

bool A = true
bool B = false
bool C = A||B;  

比你设定bool C的要好True。IT 只需要 2 个布尔值,如果其中任何一个布尔值为真,则返回真。这都是合乎逻辑的。

您可能想尝试类似的东西

if (input.find("end") != std::string::npos || input.find("End") != std::string::npos)
于 2013-10-30T18:20:34.120 回答
1

C++ 根本不能那样工作。当你写

input.find("end" || "End") != std::string::npos

编译器在两个非空 const char 指针上看到逻辑true或,这会导致 boolean value 。然后将其解释为char带有值1( '\1') 的 a,然后在字符串中搜索该值 - 当然不是您想要的。如果您想知道您的字符串是否在一组字符串中,您可以使用:

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...
}
于 2013-10-30T18:23:42.737 回答
1

||作品仅适用于逻辑布尔表达式。

从标准(重点是我的):

5.15 逻辑或运算符 [expr.log.or]

||运算符从左到右分组。操作数都根据上下文转换为bool(第 4 条)。true如果其任一操作数为,则返回truefalse否则返回。

所以在 中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

于 2013-10-30T18:22:02.450 回答
0

函数调用的参数

input.find("end" || "End") 

具有 bool 类型,表示字符串文字“end”的地址或/和字符串文字“End”的地址不等于 0。很明显,这两个字符串文字的地址都不为零。所以调用相当于

input.find(true) 

编译器找到一个最适合这个参数的重载函数 find。这个功能是

查找(charT,c,size_tipe pos = 0);

值 true 被隐式转换为值 charT( 1 ),并且该函数尝试在字符串中查找值为 1 的 char。

于 2013-10-30T18:27:21.730 回答
0

我建议使用正则表达式来代替: regex

于 2013-10-30T18:24:43.233 回答
0
 if (input.find("end" || "End") != std::string::npos)
 //             ^^^^^^^^^^^^^^

||此处未正确使用运算符。右边的表达式将返回真,因为它是非零的,然后它将被返回。因此该语句解析为input.find("end")。您需要在那里使用两个单独的条件语句:

 if (input.find("end") != std::string::npos ||
     input.find("End") != std::string::npos)
于 2013-10-30T18:21:53.753 回答
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)你可以使用逻辑或或逐位或。

于 2020-05-18T11:46:12.123 回答