Перегрузка std::string::operator[]
допускает выражения, такие как cont[k]
. Ваш код обрабатывает p
как массив std::string
, а не как массив символов, как вы предполагали. Это может быть исправлено с помощью:
const string &p = cont;
, но в этом нет необходимости, поскольку вы уже можете напрямую обращаться к cont
.
cont[k]
имеет тип char
, поэтому вызов std::string::compare()
недопустим , Вы можете сравнить char
s обычным образом:
cont[k] == '('`
Вы также должны знать, что перед C ++ 11 конец std::string
не ограничен \0
, как C string (может быть NUL после строковых данных, но это доверие к удаче). C ++ 11 действительно гарантирует это, но, вероятно, только для «исправления» старого кода, который предполагал, что это так.
Если вы используете std::string::at
вместо std::string::operator[]
, вы получите исключение, если вы превысите пределы. Но вы должны использовать на основе диапазона for
, std::string::iterator
или std::string::length()
, чтобы выполнить итерацию строки до конца.