Простое условие if со строками

Возможный дубликат:
Как мне правильно сравнивать строки в C?

#include <iostream>
using namespace std;

int main(){

    char name[100];
    cout<<"Enter: ";
    cin>>name;
    if(name == "hello"){
        cout<<"Yes it works!";
    }

    return 0;
}

Почему, когда я ввел приветствие в подсказке, я не получил «Да, это работает!» сообщение?


person user1341970    schedule 29.04.2012    source источник
comment
Поскольку name — это не строка, а массив символов.   -  person Mr Lister    schedule 29.04.2012
comment
Используйте 1_! Этот код уязвим для переполнения буфера. Если вы действительно используете C++, вам следует начать использовать классы STL.   -  person mfontanini    schedule 29.04.2012


Ответы (4)


Вам нужно использовать strcmp для проверки на равенство.

name — это массив, а не std::string, а hello — строковый литерал, то есть const char*. Вы сравниваете указатели, а не строки.

person Luchian Grigore    schedule 29.04.2012
comment
Имейте в виду, что strcmp возвращает 0, если они равны, поэтому не сравнивайте с помощью if (strcmp (name, "hello")). - person chris; 29.04.2012
comment
да. Но теперь мы должны сказать OP, что хотя в C++ name не является строкой, в C это будет строка. И сравнение все равно не удастся. Как мы делаем это тактично? - person Mr Lister; 29.04.2012
comment
@chris все, что тебе нужно, это дополнительные ;else. - person Mr Lister; 29.04.2012
comment
@MrLister, я имел в виду тенденцию просто использовать if(), а не if (... == 0). Это легкий источник логических ошибок. - person chris; 29.04.2012

Попробуй это:

#include <string.h>
#include <iostream>
using namespace std;

int main(){

    char name[100];
    cout<<"Enter: ";
    cin>>name;

    if(strcmp(name, "hello") == 0) {
        cout << "Yes it works!"; 
    }

    return 0; 
} 
person Pedro    schedule 29.04.2012
comment
Я бы не рекомендовал людям использовать методологию в стиле C, особенно в ситуации без обработки ошибок (что произойдет, если кто-то введет 100-буквенный ввод?) Кроме того, я собирался сказать, что если кто-то собирается использовать устаревшие заголовки C, он должен быть #include <cstring>, а не #include <string.h>... но, пытаясь найти ссылку на это, я обнаружил, что это не так просто, как меня заставили поверить: stackoverflow.com/questions/8380805/ - person HostileFork says dont trust SE; 29.04.2012
comment
Ты прав. Прочитав ответ Бо Перссона, я бы предпочел его решение. - person Pedro; 29.04.2012

Если вы используете std::string вместо массива символов, это будет работать:

#include <iostream>
#include <string>
using namespace std;

int main(){

    string name;
    cout<<"Enter: ";
    cin>>name;
    if(name == "hello"){
        cout<<"Yes it works!";
    }

    return 0;
}
person Bo Persson    schedule 29.04.2012

Существуют низкоуровневые строки ("С-строки"), которые не имеют высокоуровневого поведения, которое вы, вероятно, ожидаете от других языков. Когда вы вводите строковый литерал (в «кавычках»), вы создаете один из следующих типов строк:

http://en.wikipedia.org/wiki/C_string_handling

В C++ первое, что делают люди, — это передают эту низкоуровневую строку конструктору std::string, чтобы создать экземпляр класса с более удобным интерфейсом, к которому вы привыкли.

http://www.cplusplus.com/reference/string/string/

Поскольку C++ построен на основе, очень похожей на C, важно понимать, как работают строки в стиле C. В то же время профессиональная/идиоматическая программа на C++ не должна использовать такие функции, как strcmp. Для интересного исследования различий между программированием в стиле C и программированием в стиле C++, проверьте это:

Изучение стандарта C++ как нового языка (PDF), автор Бьярн

person HostileFork says dont trust SE    schedule 29.04.2012