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

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    Учтите, что язык программирования - это просто набор спецификаций и правил. Он написан на английском языке.

    Если же вас интересует на чем запрограммированы компиляторы языка С, то самые популярные нынче развивающиеся компиляторы написаны на C и C++ соответственно:
    gcc: https://github.com/gcc-mirror/gcc
    clang: https://github.com/llvm/llvm-project/tree/main/clang

    Вы спросите, а как компилятор языка Си написали на самом Си? Ответ прост - первые компиляторы были написаны на ассемблере. Они были очень простыми и тупыми, возможно не умели понимать все тонкости языка. Когда появился достаточно работающий компилятор с минимальным набором функций, можно было переписать его на Cи и скомпилировать первым компилятором. После этого стало можно компилировать компилятор на Си самим сабой.

    Точно также в компиляторы добавляют новые возможности языка - реализуют код компиляции этих вещей без их использования в исходниках и получают компилятор, который умеет их компилировать. Потом можно исходный код компилятора переписать с использованием этих новых функций, используя полученный ранее исполняемый файл компилятора.

    А так, наверно, есть куча неподдерживаемых устаревших компиляторов Си на всевозможных языках.
    Ответ написан
    1 комментарий
  • Как удалить из предложения слова в которых нет указанной буквы?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    Если бы вы использовали нормальные имена переменных, то вам бы сразу стало очевидно, какую одну строчку (даже один символ!) надо изменить, чтобы стали удалятся слова без буквы, вместо слов с буквами.

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

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

    Нужно понимать ассемблер, иметь знания по теории компиляторов (есть много книг), теории языков.

    Если же вам надо просто прикрутить компиляцию к вашему редактору, то, как многие другие IDE, вам надо будет лишь запускать сторонний компилятор (будь то gcc, clang, visual studio или что-то другое).

    У всех них есть консольное приложение которому можно передать файлы в качестве аргументов в коммандной строке. Вам остается лишь разобраться, как запускать приложения на Java.
    Ответ написан
    3 комментария
  • Как в vector на си вставлять элемент на конкретное место?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    Сначала через memmove надо сдвинуть элементы с i по count-1 на позиции i+1...count. Потом чуть изменить memcopy, чтобы записать новв элемент на позицию i, а не count.
    Ответ написан
  • Последнюю строку массива мне выводит очень много раз, в чем проблема?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    Если вы повнимательнее посмотрите на свой код, то заметите, что там вывод массива a происходит в цикле while(n>k). Где именно ошибка - непонятно, ибо неясно, что ваш код должен делать. Или вы вывод массива вставили не туда, или GetComb делает что-то не то и цикл исполняется больше раз, чем должен.
    Ответ написан
  • Как сделать проверку числа на повторность в масиве?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    Завести переменную флаг. Пройтись циклом по уже сформированному массиву, сравнить текущее число с числом в массиве. Если нашли совпадение, надо записать это в bool флаг. После цикла посмотреть на флаг.

    Можно из цикла при совпадении выходить через break.

    Нечетные числа можно генерить сразу, умножая рандом на 2 и прибавляя 1.
    Ответ написан
  • Как вытащить значение из под указателя на начало строки?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    Для преобразования из строки в число можно восспользоваться atoi().

    Однако, если в строке фиксированное заранее известное количество чисел, то лучше воспользуйтесь sscanf(). Можно указать нужное вам количество %d через запятую примерно так:
    sscanf(s, "%d, %d", &a, &b);
    Ответ написан
  • Какой список использовать?

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

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    Раз с русскими буквам не работает - это значит, что русские буквы идут в каком-нибудь utf-8 формате. Тогда один символ может задаваться несколькими байтами. Ваша работа с char проверяет, что слова являются полиндромами побайтово, что в случае utf-8 не то же самое, что посимвольно.

    Попробуйте или поменять кодировку файла на что-нибудь вроде CP1251.

    Или перепишите вашу программу используя wchar_t* и wcstok()
    Ответ написан
    3 комментария
  • Чем распарсить строку на C?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    sscanf(str, "%d,%d,%d,%d,True", ...);
    Ответ написан
    Комментировать
  • Как редактировать определенную строчку в файле?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    Вам придется прочитать весь файл, отсчитать нужное количество строк, потом заменить кусок между двумя переводами строки на отредактированное значение, и в конце переписать весь файл. Можно немного соптимизировать и переписывать не весь файл, а только начиная с изменной строки. Используйте fseek чтобы переместится на начало строки/файла, fwrite, чтобы записать новые данные и ftruncate чтобы обрезать файл, если он стал короче.
    Ответ написан
    Комментировать
  • Как сделать такой финт ушами с double?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Используйте memcopy. Копируете из адреса дабловой переменной в адрес интовой.

    Трюки с union и реинтерпритацей указателей довольно опасны.
    Ответ написан
    2 комментария
  • Как нарисовать такой рисунок на с?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    Функция вывода на экран - printf(). Один символ или строку, которую вам надо вывести надо передать туда одним параметром в кавычках, например printf("1");.
    Чтобы сделать перевод строки надо вывести символ "\n". Можно добавлять его в конец строки, например printf("44\n");
    Ответ написан
  • Безопасно ли здесь использование функции printf?

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

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

    Попрбуйте файл засунуть в корень диска и ввести абсолютный путь до него.
    Ответ написан
    Комментировать
  • Нужно ли знать +- ассемблер, чтобы изучать C?

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

    Это здорово вправляет мозги. Появляется понимание, а как вообще компьютер работает. Это не необходимое знание, конечно, но лишним оно не будет точно.
    Ответ написан
    Комментировать
  • Почему программа может использовать больше динамической памяти, чем выделил malloc()?

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

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

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    Простой файл A.h, сложный B.h.

    B.h включает A.h. Какой-то С.cpp включает и A.h и B.h в любом порядке. Фишка в использовании header-гуардов. Это вот эта штука:
    #ifndef blablabla
    #define blablabla
    
    // определения
    
    #endif // конец файла


    Каждый файл имеет свое уникальное bla-bla-bla (обычно используют имя файла с путем). В таком виде можно без проблем включать любой файл кучу раз и, пока у вас нет циклических зависимостей, сколько угодно сложный проект собирается - надо только помнить всегда включать все, что вы используете.
    Ответ написан
  • Создание терминального приложения для нескольких платформ?

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

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

    В хедере объявляете переменную как extern, в одном c файле определяете ее с инициализацией без extern - тогда все работает.
    Ответ написан
    Комментировать