если операторы не работают правильно [C ++] - PullRequest
0 голосов
/ 01 марта 2019

Я пишу код, чтобы проверить, является ли предложение палиндромом.Я чувствую, что моя логика верна, но операторы if для проверки обратной строки, похоже, не работают.Я пробовал много решений онлайн, но все еще ничего.Каждая строка считается не палиндромом.Я чувствую, что ошибка в (предложение == обратное):

#include <iostream>
#include <string>
#include <vector>
#include <fstream>
#include <sstream>

using namespace std;

int main(int argc, char *argv[])  {

while (true) {
  string sentence;
  string reverse = "";

  cout << "Enter a sentence below to check (-1 to end):" << endl;
  getline(cin, sentence);

  if (sentence == "q") {
    break;
  }

  for (int i = sentence.length(); i >= 0; i-- ) {
    reverse += sentence[i];
  }

  cout << sentence << " reversed is: " << "[" << reverse << "]" << endl;

  if (sentence == reverse) {
      cout << sentence << " is a palindrome" << endl;
  } else {
    cout << sentence << " is not a palindrome" << endl;
  }
  cout << endl;
}

}

Любая помощь будет принята с благодарностью.

Ответы [ 3 ]

0 голосов
/ 01 марта 2019

Конец строки это length - 1, поэтому используйте это вместо:

for (int i = sentence.length() - 1; i >= 0; --i)
0 голосов
/ 01 марта 2019

замените цикл for на этот

for (int i = sentence.length()-1; i >= 0; i-- ) {
0 голосов
/ 01 марта 2019

Проблема не в if.Вот эта часть:

for (int i = sentence.length(); i >= 0; i--) {
        reverse += sentence[i];
}

i = sentence.length() неверно, вы должны начать с i = sentence.length()-1.В противном случае он добавляет символ пробела в строку, что приводит к неверному результату.Этот цикл должен быть:

for (int i = sentence.length()-1; i >= 0; i--) {
        reverse += sentence[i];
}

Обратите внимание, что согласно документации :

Возвращает ссылку на символ в указанном месте поз.Проверка границ не выполняется.Если pos> size (), поведение не определено.

Таким образом, добавленный пробел не гарантирован, все может произойти.Для более безопасной версии проверьте функцию at , эта функция сгенерирует исключение, если позиция недействительна, а не тихо вызывает неопределенное поведение.

...