Строка индекс строки против строки без индекса

Проблема не связана с lambdas или std :: function, а скорее с семантикой delete. Этот код имеет ту же проблему:

class A;

class B {
    public:
        B(A *a_) : a(a_) {}
        void foo();
    private:
        A *const a;
};

class A {
    public:
        A() : b(new B(this)) {}
        ~A() {
            delete b;
        }
        void foo() { b->foo(); }
    private:
        B *const b;
};

void B::foo() {
    delete a;
}

int main() {
    A *ap = new A;
    ap->foo();
}

Проблема заключается в семантике удаления. Разрешено ли снова загружать операнд из памяти после вызова его деструктора, чтобы освободить его память?

0
задан Hami 16 January 2019 в 18:27
поделиться

1 ответ

Вы получите эту ошибку, когда word - пустая строка.

Это произойдет, если у вас есть два неалфавитных символа подряд. После проверки первой буквы вы назначаете word = "". Затем, когда вы обрабатываете следующий символ, word остается пустым, поэтому нет word[0].

Если первая буква по крайней мере "h" `, то то же самое относится и к целому слову, поэтому его не нужно индексировать. Просто напишите:

if word.lower() >= "h":

Или вы можете проверить, есть ли что-нибудь в word первым:

if word and word[0].lower() >= "h":

Нет необходимости писать "h".lower(). Это уже строчные.

Так как вам нужно повторно инициализировать word независимо от того, начинается ли он с буквы в диапазоне или нет, уберите это назначение

Таким образом, исправленный код должен быть:

for letter in sentence:
    if letter.isalpha():
        word += letter
    else:
        if word and word[0].lower() >= "h":
            print(word.upper())
        word = ""
0
ответ дан Barmar 16 January 2019 в 18:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: