Логическая ошибка из метода поиска строки 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);
В вашем коде вы вызвали строковый конструктор, который берет указатель на массив символов с нулевым символом в конце, но вы указали ему указатель на один символ. Это вызовет все виды неопределенного поведения.
Либо вызовите конструктор, который принимает счетчик + один символ, либо тот, который принимает указатель и счетчик, и вы можете сказать, что по этому адресу ровно один символ.
Редактировать Нет конструктора, который принимает один символ. Вы должны дать ему количество + символ. Что означает, что это не так красиво.