Что делает эта строка кода? [Новичок]

int main(void)
{
    string n = GetString();
    if(n!=NULL){
        for(int i=0, j=strlen(n); i<j; i++){
            if(!isalpha(n[i-1]) && isalpha(n[i])){
                printf("%c", toupper(n[i]));
            }
        }
    }
}

if(!isalpha(имя [i-1]) && isalpha(имя [i]))

как объяснить эту строку новому стартеру?(кстати, код работает правильно на гарвардском cs50 ide)

1 ответ

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

Проблема в том, что, так как i начинается со значения 0код имеет неопределенное поведение на первой итерации, так как он обращается к символу до начала массива.

Может показаться, что код правильно работает под CS50, но это просто случайность. Одной из особенностей неопределенного поведения является то, что не требуется создавать какие-либо ошибки или неожиданные результаты. Но это не делает это правильно. Это просто означает, что он не вызывал наблюдаемого симптома при некоторых обстоятельствах.

Примечание: ради обсуждения, я предполагаю string это указатель на charи что GetString() возвращает адрес первого символа в массиве char,

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