Логическая ошибка из метода поиска строки std и алгоритма подсчета

Когда я собирался решить проблему проекта Эйлера в C++, это был некоторый экспериментальный код, который я сделал. Это дало довольно неожиданный результат, поэтому я решил его на другом языке программирования. Но я очень хочу понять, почему произошла эта ошибка. Первая часть кода выполняется должным образом, она не печатает AAAA. Но во второй части логически эквивалентный код (оператор if) выполняется, когда переменная s имеет тип AAAA. И я понятия не имею, почему. Я надеюсь, что я ясно изложил свою проблему, каждый полученный ответ высоко ценится! Спасибо:)

Примечание: я использую счет от <algorithm>

#include <iostream>
#include <algorithm>

using namespace std;

int main (int argc, char** argv) {
  string alt = "LOA";

  // CODE PART 1
  string stringToFind = "AAA";

  string df = "AAAA";

  if (df.find(stringToFind) == string::npos && count(df.begin(), df.end(), 'L') <= 1) {
    cout << df; // this does not print AAAA
  }

  /* CODE PART 2:
    this was an attempt to print out every four length string combination
    of the characters L, O, A where strings with three A's in a row and
    more than one L were excluded.
  */
  for (size_t i = 0; i < 3; i++) {
    char c1 = alt[i];
    for (size_t iT = 0; iT < 3; iT++) {
      char c2 = alt[iT];
      for (size_t itr = 0; itr < 3; itr++) {
        char c3 = alt[itr];
        for (size_t itrI = 0; itrI < 3; itrI++) {
          char c4 = alt[itrI];
          string s = string(&c1)+string(&c2)+string(&c3)+string(&c4);

          if (s.find(stringToFind) == string::npos && count(s.begin(), s.end(), 'L') <= 1) {
            cout << s << endl; // this however, does print out AAAA
          }
        }
      }
    }
  }
  return 0;
}

1 ответ

Решение

Ты написал

          string s = string(&c1)+string(&c2)+string(&c3)+string(&c4);

Вы имели в виду:

          string s = string(1,c1)+string(1,c2)+string(1,c3)+string(1,c4);

или же

          string s = string(&c1,1)+string(&c2,1)+string(&c3,1)+string(&c4,1);

В вашем коде вы вызвали строковый конструктор, который берет указатель на массив символов с нулевым символом в конце, но вы указали ему указатель на один символ. Это вызовет все виды неопределенного поведения.

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

Редактировать Нет конструктора, который принимает один символ. Вы должны дать ему количество + символ. Что означает, что это не так красиво.

Другие вопросы по тегам