Ответы пользователя по тегу C
  • Почему при создании динамической строки игнорируется нулевой индекс?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    Там же число, которое читается через scanf("%d", &N); в первой строке.
    Ответ написан
  • Какая сложность у такого цикла for?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    Так.
    Ответ написан
    Комментировать
  • Как исправить ошибку "unsorted double linked list corrupted"?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    Это проблема работы с памятью. Вы там освобождаете память из-под str перед тем, как попросить gmp заполнить эту строку данными:
    free(str);
    mpz_get_str (str,10 , mul);


    gmp пишет данные туда, где была строка. Но в это место нельзя писать после free. Иногда так получается. что менеджер памяти хранит там какие-то свои данные, которые вы портите и потом получаете об этом ошибку. Память может быть возвращена системе, и тогда программа может упасть вообще при попытке записать туда что-то. Или ничего заметного может не произойти вообще.

    Как это часто бывает с ошибками работы с памятью, любая мелочь, вроде фазы луны или лишнего отладочного вывода где-то, может изменить то, как эта испорченная память используется и ошибка может не вызвать падения.
    Ответ написан
    Комментировать
  • Выдает то signal: illegal instruction core dumped то stack smashing detected terminated. Как исправить?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    Строки ваши подлиннее сделайте. Вы там по 2 символа для каждой выделяете. Но надо еще место для закрывающего 0 оставить. Поэтому, если пользователь вводит более 1 символа, происходит переполнение стека.
    Ответ написан
    Комментировать
  • Как считать строку в nasm?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    В итоге все делается через биос. Вам надо будет писать какие-то данные в I/O порты, использовать прерывания, чтобы заставить биос прочитать нажатия на кнопки и поместить данные в какую-то вашу память.
    Ответ написан
    Комментировать
  • Как реализовать завершение игры "Жизнь" на Си?

    wataru
    @wataru Куратор тега Алгоритмы
    Разработчик на С++, экс-олимпиадник.
    Раз поле конечное, то цикл будет обязательно, но алгоритмически понять, что вот мы уже на нем - никак нельзя.

    Можно запоминать предыдущие поля. Хотя бы в виде хешей для экономия памяти. Чтобы из-за коллизии не заврешаться раньше времени, можно считать несколько принципиально разных хешей (допустим, sha256 и какой-то полиномиальный хеш), и плюс брать "слепок" от поля (какие-то 256 разбросанных по полю клеток).

    Или, если поле не большое, то можно вместе с хешом хранить все поле. Если где-то хеши совпали, то дальше нужнол сравнивать уже поля целиком поклеточно.
    Ответ написан
    1 комментарий
  • Почему крупные библиотеки для обработки мультимедиа используют чистый си?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    Переносимость и скорость - основные доводы использовать именно Си.
    Ответ написан
    Комментировать
  • Как передать двумерный массив функции?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    Если ваш двумерный массив сделан как указатель-на-массив-указателей-на-строки - то да. Если же вы завели массив вроде int a[100][200]; - то нет.
    Ответ написан
    Комментировать
  • C - как сделать замену подстроки в строке (руками)?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    А что делает startsof()?

    Даже если принять, что оно действительно ищет вхождение второй строки в первой - у вас там в каждой второй строчке ошибка.

    malloc(string_size + sub_size - to_size);

    Объясните мне, как вы получили вот это значение длины?

    А дальше копирование у вас неправильно. Чтобы заменить строку-вхождение вам надо в ответ скопировать начало str1 до вхождения, потом скопировать to, потом скопироваать конец строки str1, после вхождения. Это должны быть три параллельных цикла. У вас в одной ветке их 2 (один в функцию бесполезную спрятан), в другой - только 1.
    Ответ написан
    Комментировать
  • Как инициализировать массив?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    А что вы вводите? Сдается мне, что ваш код ждет в цикле
    while (getchar() != '\n') continue;

    Это произойдет, если вы введете строку короче len-1 символов.

    Чтобы это исправить, можно вставить в функцию проверку, если ch после первого цикла оказался '\n' - то второй цикл не нужен.

    Или можно этот цикл вставить перед break в предыдущий цикл. Вы же должны пропустить символы до перевода строки только если строка слишком длинная.
    Ответ написан
    Комментировать
  • Что находится в .text секции?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    В .text Находится исполняемый код.

    6kb там не зря. Там куча вспомогательного кода, чтобы взаимодействовать с операционной системой. Начиная от загрузки всяких внутренностей libc, до настройки консоли.
    Ответ написан
    Комментировать
  • Что означает -'0' на C?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    Это вычитание значения '0' из значения str[j]. И то и другое - символы, они же char. В языке Cи, это целочисленный тип. Просто каждому символу дается его ascii код.

    Тут это используется для получения численнного значения цифры из ее символьного значения, ведь символы '0'-'9' в ascii идут подряд в натуральном порядке.
    Ответ написан
    Комментировать
  • Как дописывать число в файл со сложением через base64?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    Вместо числа пишите в файл строку. Строку получайте прогоняя число через какую-то библиотеку с base64 функцией.
    Ответ написан
    Комментировать
  • Как записать значение в файл и зашифровать его на языке C?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    Открывайте файл в бинарном режиме "wb" и пишите туда через fwrite (лучше побайтово, чтобы не мучиться с переносимостью из-за порядком байтов в int).

    Читайте, соответственно, через fread.

    Для шифрования лучше всего, во-первых, байты в разном порядке писать, (не 0,1,2,3, а, скажем, 2,0,3,1) и, во-вторых, xor-ить их с какими-то константами. А еще лучше не с константами, а со случайными данными, которые тоже записываются в файл рядом. Или не рядом, так будет закономерность меньше видна.

    Но все это может спасти только от людей незнакомых с reverse engineering'ом и отладкой. Более менее осведомленный ползователь посмотрит в ассемблерный код и поймет, что и как там читается и где и что надо поменять. Но да, это посложнее просто редактирования txt файла.

    Ну и, artmoney с cheat engine никто не отменял.
    Ответ написан
    Комментировать
  • Как избежать дублирования последней строки из файла?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    Вам надо проверять, что вернет fscanf. Если оно у вас вернет что-то меньшее 2, то значит оно не смогло прочитать обе строки. В этом случае надо выходить из цикла и не класть новую запись в таблицу
    Ответ написан
    Комментировать
  • Почему в моем коде портится содержимое переменных?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    Проблема в переменной file_name, а в не функции. Судя по адресу, она на стеке. Причем на месте где-то в середине лакальной переменной buffer.

    Это значит, что вы из какой-то функции раньше вернули указатель на локальную переменную и получили висячий указатель.
    Ответ написан
    1 комментарий
  • Как определить количество разных букв алфавита?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    Попробуйте константу ascii уведичить до 256. Русские буквы в cp1251 идут во второй половине алфавита.

    Edit, ну и тип строки unsigned char надо. А то к отрицательным индексам будет доступ.
    Ответ написан
  • Как в языке си вернуть пустой массив?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    В Си у массивов нет встроенной длины*. Массив - это обычно просто указатель на область памяти, где лежат его элементы. А сколько их там, надо как-то отдельно хранить и передавать. Можно, как в строках, помечать специальным символом конец, или можно передавать длину в отдельной переменной рядом с массивом.

    Соответственно, чтобы вернуть пустой массив, надо вернуть массив длины 0. Ваша функция же как-то должна возвращать длину массива? Вот точно также, как если бы длина была 1, только 0. Или сразу первым элементом идет маркер конца массива. Или переменная длины, которую, скорее всего, придется сделать out параметром функции, будет содержать 0. Или можно NULL возвращать, как особый случай, что ничего нет.

    * Исключение - статические массивы, где длина массива известна во время компиляции. Но его длину можно менять только в самом коде, поэтому тут этот случай не подходит.
    Ответ написан
    Комментировать
  • Как инициализировать n так что бы оно работало для всех введенных n,а не только для 2?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    Между вводом и проверкой в if-e надо поставить логическую операцию или (||).
    Ответ написан
  • Как поменять местами ноды стека/односвязного списка?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    Ну да, вам придется рассматривать отдельный случай - когда они идут подряд. Проверяйте, что а вдруг min->next == max. Нарисуйте картинку из четырех точек before_min, min, max, max->next со стрелочками до помены и после. Смотрите у каких трех вершин ссылки поменяются и как. Запишите это в коде.

    Еще есть случай max->next == min, но его можно рассмотреть вместе с предыдущим - просто в этом случае поменяйте месами указатели min и max (а также before_min и before_max). Тогда код для прошлого случая сработает. Вам же в момент помены без разницы, какая вершина максимум, а какая минимум. Вам надо только 2 заданные вершины поменять местами.
    Ответ написан