Или оператор не работает

Когда я вхожу в пуск, программа выводит функцию 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

Решение

замещать

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" это не строка

4

Другие решения

Логика или оператор, || работает только в логических выражениях.

Например, если у вас было

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)
2

|| работает только в логическом логическом выражении.

Из стандарта (акцент мой):

5.15 Логический оператор ИЛИ [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,

1

С ++ просто так не работает. Когда ты пишешь

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

компилятор видит логический или на двух ненулевых указателях на константные символы, что приводит к логическому значению true, Это тогда интерпретируется как char со значением 1 ('\1') который затем ищется в строке — конечно, не то, что вы хотели. Если вы хотите узнать, входит ли ваша строка в набор строк, вы можете использовать:

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...
}
1
 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)
0

Я бы рекомендовал использовать регулярные выражения вместо таких вещей:
регулярное выражение

0

Аргумент вызова функции

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

имеет тип bool и означает, что адрес строкового литерала «end» или / и адрес строкового литерала «End» не равен нулю. Очевидно, что оба строковых литерала имеют адреса, которые не равны нулю. Таким образом, вызов эквивалентен

input.find(true)

Компилятор находит перегруженную функцию find, которая наиболее подходит для этого аргумента. Эта функция

найти (charT, c, size_tipe pos = 0);

Значение true неявно преобразуется в значение charT (1), и функция пытается найти char со значением 1 в вашей строке.

0
По вопросам рекламы [email protected]