WikiSort.ru - Программирование

ПОИСК ПО САЙТУ | о проекте

Программирование методом подбора, который иногда называют «случайным программированием», это подход к разработке программного обеспечения, при котором программист решает проблему итеративно, делая небольшие изменения (перестановки) и тестирование каждого изменения, чтобы увидеть, ведёт ли оно себя, как хотелось бы.

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

Пример

Например, следующий пример кода C (предназначен для поиска и копирования последовательности цифр с большой строки) имеет несколько проблем:

char* buffer = "123abc";
char destination[10];

int i = 0;
int j = 0;
int l = strlen(buffer);

while (i < l) {
    if (isdigit(buffer[i])) {
        destination[j++] = buffer[i++];
    }
    ++i;
}

destination[j] = '\0';
printf("%s\n", destination);

Но это не даёт правильного результата. Для заданной начальной строки он печатает «13», в то время как правильным результатом является «123». Программист, не видящий структурной проблемы, может ухватиться за одну команду, сказав «ага, здесь лишнее увеличение на единицу». Он удаляет строку «++i», но при тестировании программа зацикливается. «Ой, неверное увеличение». Команда возвращается на место и удаляется post-increment переменной i строкой выше:

    if (isdigit(buffer[i])) {
        destination[j++] = buffer[i];
    }

В ходе тестирования код теперь выдаёт правильный ответ, "123". Однако, поскольку программист не затруднил себя полным пониманием кода, остаются следующие проблемы:

  • Если ввод содержит несколько чисел, разделённых нецифровыми символами, например "123аб456", в целевой буфер попадут все цифры подряд
  • Если ввод длиннее целевого буфера то целевой буфер переполнится
  • Если ввод длиннее INT_MAX то поведение становится неопределённым, поскольку strlen() возвращает беззнаковое целочисленное значение типа size_t, в котором может храниться значение, большее максимума для знакового целочисленного
  • Если на используемой платформе тип char - знаковый и ввод содержит символы не из диапазона от 0 до UCHAR_MAX после приведения к int то вызов isdigit() приводит к неопределённому поведению.

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

Примечания

    Данная страница на сайте WikiSort.ru содержит текст со страницы сайта "Википедия".

    Если Вы хотите её отредактировать, то можете сделать это на странице редактирования в Википедии.

    Если сделанные Вами правки не будут кем-нибудь удалены, то через несколько дней они появятся на сайте WikiSort.ru .




    Текст в блоке "Читать" взят с сайта "Википедия" и доступен по лицензии Creative Commons Attribution-ShareAlike; в отдельных случаях могут действовать дополнительные условия.

    Другой контент может иметь иную лицензию. Перед использованием материалов сайта WikiSort.ru внимательно изучите правила лицензирования конкретных элементов наполнения сайта.

    2019-2024
    WikiSort.ru - проект по пересортировке и дополнению контента Википедии