C++: проверка строки

213
29 декабря 2018, 05:30
#include <cstdlib>
#include <iostream>
#include <windows.h>
using namespace std;
int hp=100;
char start[20];
void draw() {
    system("color 7");
}
void enter_start(){
    cout <<"Добро пожаловать в CPP Wars!" <<endl;
    cout <<"Введите 'Start' для начала игры" <<endl;
    cin >>start;
    cout <<"Начинаем игру!" <<endl;
    system("cls");
}
void game(){
    cout <<"У вас " <<hp <<" делаем ход" <<endl;
    if (rand()% 2 == 0) {
        system("color a");
        cout <<"Вас ударили -1 hp!" <<endl;
        hp-=1;
        Sleep(2000);
        system("cls");
    }
    else {
        system("color c");
        cout <<"Вы восстановили силы +1 hp" <<endl;
        hp+=1;
        Sleep(2000);
        system("cls");
    }

}
void check(){
    if (start=="Start") {
        game();
    }
    else {
        cout <<"Команда введена не верно! Повторите попытку " <<start <<endl;
    }
}
int main() {
    setlocale(LC_ALL, "Russian");
    while(hp > 0){
        draw();
        enter_start();
        check();
    }
    system ("color 4");
    cout <<"Игра окончена" <<endl;
    cout <<"Вы умерли..." <<endl;
    return 0;
}

Функция check() почему-то не работает, при вводе "Start" она все равно выводит сообщение о том, что "Команда введена не верно!" Не могу понять, где я ошибся, прошу вашей помощи!

Answer 1

Классический косяк со сравнением строк через указатели.

У вас == сравнивает не содержимое строк, а их адреса. Раз это две отдельные строки, то адреса всегда разные, и возвращается всегда false.

В C++ не принято использовать массивы символов для хранения строк (без большой необходимости). Для этого есть std::string.

Замените char start[20]; на std::string start;, и все заработает. Не забудьте добавить #include <string>.

(Раз у вас стоит using namespace std;, то string start; тоже подойдет. Но using namespace std; - вещь не очень хорошая, я бы советовал от нее отказаться.)

Кроме того, это решает проблему со вводом большего количества символов, чем есть места в массиве. std::string сама растянулась бы до нужного размера, а выход за границы char name[20]; вызовет неопределенное поведение, и, скорее всего, вылет.

Если вы настаиваете на char name[20], то для сравнения его с другой строкой используйте std::strcmp. Так это делается в варварских землях С, где нет такой роскоши, как std::string.

Либо используйте цикл и сравнивайте строки посимвольно, но в этом мало смысла, ведь strcmp уже делает то же самое.

Answer 2

Понимаете, сравнение переменных типа

char str[];

или

char * str;

со строковым литералом (или между собой - неважно)

str == "String"

сравнивает два указателя - str и указатель на строковый литерал, но не содержимое строк. Очевидно, что это два разных указателя, и такое сравнение всегда ложно.

Строки в стиле C сравниваются с помощью функции strcmp. С помощью оператора == можно сравнивать содержимое строк типа string (но это не ваш случай, если только вы не выполните преобразование в string...).

READ ALSO
Почему атрибут не добавляется в модель?

Почему атрибут не добавляется в модель?

Не судите строго, ошибка в какой-то мелочи наверноеЕсть view

196
Как показать изображение оффлайн в FirebaseDatabase

Как показать изображение оффлайн в FirebaseDatabase

Вот мой код! Приложение запоминает имя и статус чтобы показать их оффлайн но как мне сохранить изображение чтобы показать их оффлайнЗаранее...

254
Регистрация servlet в jetty 9: StackOverFlow при отсутствии DefaultServlet

Регистрация servlet в jetty 9: StackOverFlow при отсутствии DefaultServlet

Я запускаю Jetty сервер и пытаюсь зарегистрировать сервлетВот в таком виде все работает:

203