Решено: Как сравнить массив символов со строковой константой? (С++)

Модератор: Модераторы разделов

Аватара пользователя
baldman88
Сообщения: 233

Решено: Как сравнить массив символов со строковой константой?

Сообщение baldman88 »

Помогите, пожалуйста. Есть что то типа :

Код: Выделить всё

char str[10];
std::cin.getline(str, 10);

как теперь можно сравнить массив str со строковой константой (наподобие if (str == "hello"))?
Спасибо сказали:
Аватара пользователя
serzh-z
Бывший модератор
Сообщения: 8259
Статус: Маньяк
ОС: Arch, Fedora, Ubuntu

Re: Решено: Как сравнить массив символов со строковой константой?

Сообщение serzh-z »

int n = strcmp(str, "test");
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Решено: Как сравнить массив символов со строковой константой?

Сообщение drBatty »

baldman88 писал(а):
07.07.2009 01:56
std::cin.getline(str, 10);

может 9?
в С/С++ массив символов всегда заканчивается \0
для этого "символа" тоже нужно место...
а вообще да, ctrcmp вернёт 0, если строки равны, и <0, если первая "меньше" второй.

PS: можно так

Код: Выделить всё

int cmp;
while(!(cmp =*s1++ - *s2++) && *s1);

только не тестировал...
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
sim1
Сообщения: 155
ОС: GNU,BSD

Re: Решено: Как сравнить массив символов со строковой константой?

Сообщение sim1 »

Если используете плюсы, как я понял из вашей постановки задачи, (с++) то лучше пользоваться stl-ем для всех операций не только для получения массива символов

Код: Выделить всё

#include <iostream>
#include <string>

usgin namespace std;

int main( void ) {
    char str[10];
    cin.getline(str, 10);
    if ( string(str) == "test" ) {
        cout << " is equal " << endl;
    } else {
        cout << " not equal" << endl;
    }
    return 1;
}
Однако, если вопрос сводится к вопросу к работе со строками, то лучше везде использовать stl класс string

Код: Выделить всё

....
string str;
cin >> str

if ( str == "test" ) {
....
} else {
....
}
....
Спасибо сказали:
watashiwa_daredeska
Бывший модератор
Сообщения: 4038
Статус: Искусственный интеллект (pre-alpha)
ОС: Debian GNU/Linux

Re: Решено: Как сравнить массив символов со строковой константой?

Сообщение watashiwa_daredeska »

sim1 писал(а):
07.07.2009 08:24
string str;
cin >> str
Не учите плохому. Эта фигня делает совсем не то же самое, что getline.

В принципе, совет пользоваться стандартной библиотекой -- правильный. Для чтения строки лучше пользоваться ::getline().
Спасибо сказали:
sim1
Сообщения: 155
ОС: GNU,BSD

Re: Решено: Как сравнить массив символов со строковой константой?

Сообщение sim1 »

watashiwa_daredeska писал(а):
07.07.2009 09:37
sim1 писал(а):
07.07.2009 08:24
string str;
cin >> str
Не учите плохому. Эта фигня делает совсем не то же самое, что getline.

В принципе, совет пользоваться стандартной библиотекой -- правильный. Для чтения строки лучше пользоваться ::getline().


согласен, привел в качестве примера, пример не удачный, чтобы внести однозначность

getline - читает всю строку до символа перевода '\n',
а оператор >> считает до первого пробелам
Спасибо сказали:
Аватара пользователя
baldman88
Сообщения: 233

Re: Решено: Как сравнить массив символов со строковой константой?

Сообщение baldman88 »

Всем большое спасибо, разобрался :happy:
drBatty писал(а):
07.07.2009 05:11
может 9?
в С/С++ массив символов всегда заканчивается \0
для этого "символа" тоже нужно место...

почему то у меня (думаю что и у всех) getline() сама записывает последний символ '\0', то есть если указать getline(str, 10) -- переполнение не происходит (str, как положено равно 9 символам, а если указать (str, 9) -- 8-ми.) или я ошибаюсь?
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Решено: Как сравнить массив символов со строковой константой?

Сообщение drBatty »

baldman88 писал(а):
07.07.2009 15:03
почему то у меня (думаю что и у всех) getline() сама записывает последний символ '\0'

конечно записывает...
baldman88 писал(а):
07.07.2009 15:03
переполнение не происходит (str, как положено равно 9 символам, а если указать (str, 9) -- 8-ми.) или я ошибаюсь?

не знаю.
я 9 пишу, а массив размером 10. на всякий случай :)
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
baldman88
Сообщения: 233

Re: Решено: Как сравнить массив символов со строковой константой?

Сообщение baldman88 »

Это всё хорошо, но столкнулся со следующей проблемой :
этот символьный массив, я пытаюсь получить в цикле, только если ввести значение больше 15 символов, дальше уже как не вводи -- не получается(даже если 100% правильно). подозреваю, что что то не так в моём цикле(чего то не хватает). вот код(не ругайте, только изучаю с++, хотя конструктивная критика очень приветствуется :blush: ) :

Код: Выделить всё

// ip.cpp
#include <iostream>
#include <string>
//#include <cstring>

bool eval(char* part) {
    int total = 0;
    for (int i = 0; part[i] != '\0'; i++)
        total = ((total * 10) + (part[i] - '0'));
    if ((total >= 0) and (total <= 255))
        return true;
    else
        return false;
}

bool is_ip(char* str) {
    const int size = 15;
    int point_counter = 0;
    int digit_counter = 0;
    char part[4];
    for (int i = 0; str[i] != '\0'; i++) {
        if (point_counter < 4) {
            if (((str[i] - 48) >= 0) and ((str[i] - 48)  <= 9)) {
                if (digit_counter < 3) {
                    part[digit_counter] = str[i];
                    digit_counter++;
                }
                else
                    return false;
            }
            else if (str[i] == '.') {
                if (digit_counter == 0)
                    return false;
                else {
                    part[digit_counter] = '\0';
                    if (eval(part)) {
                        digit_counter = 0;
                        point_counter++;
                    }
                    else
                        return false;
                }
            }
            else
                return false;
        }
        else
            return false;
    }
    part[digit_counter] = '\0';
    if (not eval(part))
        return false;
    if ((point_counter != 3) or (digit_counter == 0))
        return false;
    else
        return true;
}

int main() {
    char ip[17];
    do {
        std::cin.getline(ip, 16);
    } while ((std::string(ip) != "dhcp") and (is_ip(ip) != true));
    //} while ((std::strcmp(ip, "dhcp")) and (is_ip(ip) != true));
    std::cout << "ip : " << ip << std::endl;
    return 0;
}
Спасибо сказали:
sim1
Сообщения: 155
ОС: GNU,BSD

Re: Решено: Как сравнить массив символов со строковой константой?

Сообщение sim1 »

замечание по коду:
ну если c++ то и юзайте везде класс string, наверно я действительно приводил плохие примеры

Код: Выделить всё

using namespace std;
string ip;
do {
   getline( cin,ip );
} while ( ip != "dhcp" )

данный кусок кода позволит вам считывать все строку до символа '\n' без ограничений на кол-во символов
цикл по вводу данных строк прервется, после того, как пользователь введет dhcp.
Спасибо сказали:
Аватара пользователя
baldman88
Сообщения: 233

Re: Решено: Как сравнить массив символов со строковой константой?

Сообщение baldman88 »

Всё, переделал под использование std::string, и всё заработало, как нужно :happy:
Спасибо за помощь! Вот что вышло :

Код: Выделить всё

// ip.cpp
#include <iostream>
#include <string>

bool is_in_range(char* part) {
    int total = 0;
    for (int i = 0; part[i] != '\0'; i++)
        total = ((total * 10) + (part[i] - '0'));
    if ((total >= 0) and (total <= 255))
        return true;
    else
        return false;
}

bool is_ip(std::string& str) {
    int point_counter = 0;
    int digit_counter = 0;
    char part[4];
    for (int i = 0; i < str.length(); i++) {
        if (point_counter < 4) {
            if (((str[i] - 48) >= 0) and ((str[i] - 48)  <= 9)) {
                if (digit_counter < 3) {
                    part[digit_counter] = str[i];
                    digit_counter++;
                }
                else
                    return false;
            }
            else if (str[i] == '.') {
                if (digit_counter == 0)
                    return false;
                else {
                    part[digit_counter] = '\0';
                    if (is_in_range(part)) {
                        digit_counter = 0;
                        point_counter++;
                    }
                    else
                        return false;
                }
            }
            else
                return false;
        }
        else
            return false;
    }
    part[digit_counter] = '\0';
    if (not is_in_range(part))
        return false;
    if ((point_counter != 3) or (digit_counter == 0))
        return false;
    else
        return true;
}

int main() {
    std::string ip;
    do {
        std::getline(std::cin, ip);
    } while ((ip != "dhcp") and (is_ip(ip) != true));
    std::cout << "ip : " << ip << std::endl;
    return 0;
}
Спасибо сказали: