Простой алгоритм не работает

Написал решение тривиальной задачки, но она почему-то не работает. Сколько не тестил, всё хорошо, но 40% проверок на сайте не проходит.

Условие: У Витека есть набор кубиков, на котором изображены английские буквы, причём как маленькие, так и большие. Недавно мама подарила ему ещё и набор кубиков с цифрами, в результате чего Витек научился быстро считать в пределах 10-ти. А вот отец имел неосторожность подарить ему набор разноцветных маркеров, после чего Витек начал экспериментировать с кубиками с цифрами: он зарисовывал очередную цифру и на её месте рисовал цифру на единицу большую. Так как он прекрасно понимал, что цифры 10 не существует, он вместо числа 10 всегда писал цифру 0

Учтите, что иногда мама звала Витека покушать и он не успевал завершить начатую работу и написать новую цифру – в этом случае кубик навсегда оставался пустым, такие кубики обозначены символом пробела

Необходимо помочь Витеку и написать программу, которая выполнит очередную маркЕровку кубиков по указанным правилам. Так как Вы находитесь не дома, а на олимпиаде, то мама Вас кушать не позовёт и работу Вам обязательно нужно закончить.

Входные данные

Единственная строка, состоящая из описанных выше символов. Длина строки не превышает 255 символов.

Выходные данные

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

Примеры првавильных тестов:

Входные данные #1

abc2345678901ABC

Выходные данные #1

abc1234567890ABC

Входные данные #2

35725yg q69 PD3K65QlO5rGB98A53Y17aUI60Bd74j63xk6

Выходные данные #2

46836yg q70 PD4K76QlO6rGB09A64Y28aUI71Bd85j74xk7

Код:

#include <iostream>
#include <string>

using namespace std;

int main() {
    string str;
    getline(cin, str);
    for (int i = 0; i < str.length(); i++)
    {
        if (str[i] >= 48 and str[i] <= 57)
        {
            if (str[i] == '1' and str[i + 1] == '0')
            {
                cout << '0';
                i += 1;
            }
            else
            { 
                if (str[i] != '9')
                {
                    str[i] += 1;
                    cout << str[i];
                }
                else cout << '0';
            }
        }
        else cout << str[i];
    }
}

Ответы (2 шт):

Автор решения: V-Mor

Во-первых, не понятно, как это у автора вообще проходило какие-либо тесты, т.к. ключевого слова and в С++ нет.

Во-вторых, для проверки, является ли символ представлением числа, достаточно использовать встроенную функцию isdigit, а не перебирать коды символов вручную.

В-третьих, как я уже написал в комментарии, у автора довольно странно сделано вот это:

            if (str[i] == '1' and str[i + 1] == '0')
            {
                cout << '0';
                i += 1;
            }

Не говоря про and, str[i + 1] здесь – потенциальный выход за границы (если i будет равно последнему элементу массива). И сама логика не ясна. Если данное число равно 1, а следующее 0, нужно вывести 0 и пропустить следующее... Но по условию ведь на 0 нужно заменять 9, а не 10. Здесь вообще не бывает 10, здесь есть только 1 и 0.

В-четвёртых, str[i] += 1; возвращает int, а значит cout выводит код каждого символа числами, а не сами символы, а потому нужно преобразовывать коды обратно в символы.

В общем, принимая во внимание вышесказанное, я бы написал так:

#include <iostream>
#include <string>


using namespace std;

int main() {
    string str;
    getline(cin, str);
    for (int i = 0; i < str.length(); i++)
    {
        if (isdigit(str[i]))
        {
            if (str[i] != '9')
            {
                cout << static_cast<char>(str[i] + 1);
            }
            else cout << '0';
        }
        else cout << str[i];
    }
}
→ Ссылка
Автор решения: TigerTV.ru

Еще вариант:

#include <iostream>
#include <string>

int main() {
    std::string s;
    std::cin >> s;

    for (int i = s.length() - 1; i >= 0; --i) {
        if (std::isdigit(s[i])) {
            ++s[i];
            if (s[i] == ':') s[i] = '0';
        }
    }

    std::cout << s;
}
→ Ссылка