Сравнение строк в C ++ с использованием оператора == - PullRequest
0 голосов
/ 17 февраля 2012

У меня есть вопрос о сравнении строк в C ++. Мой код ниже должен проверить, является ли слово палиндромом (пишется одинаково вперед и назад). Проблема в том, что мой оператор if (s1 == s2) никогда не принимает значение true. У меня такое ощущение, что в памяти эти две строки разные, но у меня нет никаких конкретных доказательств. Любой совет? Спасибо!

#include <iostream>
#include <string>

using namespace std;

int main()
{
    string s1, s2;
    cin >> s1;

    for(int i = 0; i <= s1.size(); i++){
        s2.push_back(s1[(s1.size() - i)]);
    }
    cout << s1 <<endl;
    cout << s2 <<endl;


    if(s1 == s2){
        cout << "Correct" <<endl;
    }
    else {
        cout << "Incorrect" <<endl;
    }
    return 0;
}

Ответы [ 7 ]

4 голосов
/ 18 февраля 2012

Это выходит за пределы для строк

for(int i = 0; i <= s1.size(); i++){
    s2.push_back(s1[(s1.size() - i)]);
}

Строка имеет только символы в диапазоне 0..size()-1. Вы одновременно считаете и индексируете одну позицию.

3 голосов
/ 17 февраля 2012

Но вам лучше использовать следующее вместо цикла:

s2.assign(s1.rbegin(), s2.rend());
1 голос
/ 17 февраля 2012

Ваша проблема не в сравнении строк.Посмотрите, как вы строите обратную строку.

0 голосов
/ 18 февраля 2012

Поскольку i начинается с 0, вы получите доступ к s1[s1.size()-0], который вернет нулевой символ.Обратите внимание, что решения, предлагающие использовать s1.size() - i - 1, являются неправильными , так как вы выполняете итерацию вплоть до s1.size(), что означает, что вы в какой-то момент получите доступ к s1[-1].Это намного хуже, чем доступ к s1[s1.size()], так как поведение не определено.Начните итерацию с 1, и затем вы можете оставить оставшуюся часть кода без изменений (но, пожалуйста, сделайте отступ!).

Как уже упоминали другие, определение s2 как std::string s2(s1.rbegin(), s1.rend()); еще яснее.

0 голосов
/ 17 февраля 2012

Вы, вероятно, имели в виду s1.size() - i - 1.

0 голосов
/ 17 февраля 2012

Индекс находится вне диапазона в вашем случае.Вот правильный код (я инициализирован с 1, а не 0):

for(int i = 1; i <= s1.size(); i++){
        s2.push_back(s1[(s1.size() - i)]);
    }
0 голосов
/ 17 февраля 2012

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

исправлено: вам нужно использовать: строка :: сравнить

удачи

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...