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

論理 or 演算子は||、ブール式でのみ機能します。

たとえば、

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

に設定bool CするよりもTrue。IT は 2 つのブール値を取り、これらのブール値のいずれかが true の場合に true を返します。それはすべて論理的です。

次のようなものを試してみたいかもしれません

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

||論理ブール式でのみ機能します。

標準から(強調は私のものです):

5.15 論理 OR 演算子 [expr.log.or]

演算子は||左から右にグループ化します。オペランドは両方とも文脈上bool(節 4) に変換されます。trueオペランドのいずれかが である場合は戻りtruefalseそうでない場合は戻ります。

では、input.find("end" || "End")と に変換しよう"end""End"boolます。また、演算子||は a も返しboolます。


ここで問題を解決するには、交換する必要があります:

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

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

2 番目のfind.

于 2013-10-30T18:22:02.450 に答える
0

関数呼び出しの引数

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

bool 型を持ち、文字列リテラル「end」のアドレスまたは/および文字列リテラル「End」のアドレスがゼロに等しくないことを意味します。両方の文字列リテラルのアドレスがゼロでないことは明らかです。したがって、呼び出しは次と同等です

input.find(true) 

コンパイラは、この引数に最も適したオーバーロードされた関数 find を見つけます。この機能は

find( charT, c, size_tipe pos = 0 );

値 true は暗黙的に値 charT( 1 ) に変換され、関数は文字列内で値 1 の char を見つけようとします。

于 2013-10-30T18:27:21.730 に答える
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;
}

論理的な or または一口単位の or を使用する代わりに、thisif (input.find("end") != std::string::npos | input.find("End")!= std::string::nposまたは thisのようにする必要があります。if (input.find("end") != std::string::npos || input.find("End")!= std::string::nposif (input.find("end" || "End") != std::string::npos)

于 2020-05-18T11:46:12.123 に答える
0
 if (input.find("end" || "End") != std::string::npos)
 //             ^^^^^^^^^^^^^^

ここ||では演算子が正しく使用されていません。右側の式は非ゼロであるため true を返し、それが返されます。したがって、ステートメントは に解決されinput.find("end")ます。そこでは、2 つの別個の条件ステートメントを使用する必要があります。

 if (input.find("end") != std::string::npos ||
     input.find("End") != std::string::npos)
于 2013-10-30T18:21:53.753 に答える