Ответы пользователя по тегу C
  • Как разбить строку в Си на части?

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

    Для первой переменной просто скопируйте первый символ.
    Ответ написан
    Комментировать
  • Почему происходит сегфолт?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    Комментарии в коде вроде //4 значение по адресу однозначно говорят, в чем проблема. Вы хотите работать с четверкой чисел, а в строке их у вас всего 2.
    Ответ написан
  • Подсчет чисел в массиве, в языке C?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    Человек под номером i (c 0) идет в команду i % K, где K - количество команд (опять же, нумерация с 0).

    Вам надо лишь в цикле пройтись по всем числам и прибавить их в соответствующую ячейку ответа.
    Ответ написан
    Комментировать
  • Быстро ли мое решение?

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

    Ваш текущий вариант вносит дополнительное разименовывание указателя на каждое число.
    Вариант с memcpy внесет дополнительное копирование, что помедленнее разыменовывания указателя по идее.

    Но на практике все зависит от кучи факторов. Много ли у вас чисел, попадают ли они в кеш процессора, как далеко лежат две части буффера, как долго идет обработка каждого числа. Проверить это в итоге можно только практикой, но, скорее всего, ваше текущее решение будет быстрее memcpy, потому что единственное приемущество memcopy будет в том, что данные лежат в памяти подряд, что очень дружественно к кешу. Но вашем текущем решении и сами указатели и то, куда они указывают, итак лежат в памяти подряд (кроме одного индекса, где меняются массивы).
    Ответ написан
    Комментировать
  • Как работать с указателями?

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

    Вы же менянте местами значения int, значит временная переменная tmp должна быть int, а указатели надо разименовывать.
    Ответ написан
    Комментировать
  • Как посчитать количество разных букв в массиве строк?

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

    Второй вариант - отсортировать символы. Там уже проще подсчитать все символы - это 1 + сколько разных соседей в отсортированном массиве. Это быстрее, если использовать быструю сортировку.

    Ну или самый быстрый способ - в массиве на 256 счетчиков подсчитайте, сколько раз каждый символ встречается. Потом подсчитайте, сколько там ненулевых элементов.
    Ответ написан
  • Как в Си вывести в консоль без записи в буфер?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    Можно выводить в stderr через fprintf. Тогда перенаправление в файл запишет туда только то, что выведено в stdout через printf.

    А так /a.out > file.log просто перенаправляет stdout в файл и все, что будет туда выведено, будет записано в файл самой системой. Ваша программа не знает, куда там система будет содержимое потока выводить - в консоль или в файл. Никак на это повлиять вы не сможете. Остается только писать в другой поток, например stderr.
    Ответ написан
  • Какими функциями заменить array_diff() в Си?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    Руками. Если лень писать свою хеш таблицу, то можно и совсем в тупую. Итерируйтесь по списку a. Внутри итерируйтесь по списку b и, если нашли там элемент, то удаляйте из a. Иначе переходите к следующему элементу.

    Более продвинутый вариант - отсортировать список b и искать там каждый элемент из a бинарным поиском.

    Удобный трюк для удаления элементов из массива - хранить индекс первого не занятого элемента. Тогда получается что-то вроде этого:
    int empty_pos = 0;
    for (int i = 0; i < n; ++i) {
      if (!ShouldDelete(a[i], b)) {
        a[empty_pos++] = a[i];
      }
    }
    n = empty_pos;
    Ответ написан
    3 комментария
  • Почему при создании динамической строки игнорируется нулевой индекс?

    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 идут подряд в натуральном порядке.
    Ответ написан
    Комментировать