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

    @MiiNiPaa
    С очень активно используется в embedded программировании: С проще чем С++. Для него проще написать компилятор. Ресурсы управляются вручную и их расход легче контролировать.

    С++ очень зависит от качества оптимизатора в компиляторе. Если у вас хреновый компилятор, то для максимальной эффективности придётся писать на «устаревшем С с классами». А для всяких специфических железок компиляторы обычно хреновые.

    Взгляните на стандартную библиотеку: она написана для использование в дико ограниченных условиях: все параметры и результат умещаются в регистрах (поэтому много указателей), никакого выделения памяти в функциях (поэтому куча функций вроде gmtime, и даже _s функции в С11 пишут в переданный объект). Это позволяет использовать С в системах реального времени без сильных ограничений на библиотеку и язык.

    С и С++ занимают разные ниши и поэтому не могут заменить друг-друга.
    Ответ написан
    Комментировать
  • Как применить sizeof в функции?

    @MiiNiPaa
    Массивы в С++ это одна большая ложь. На самом деле это просто кучка данных, расположенная последовательно в памяти. Хоть какую-то информацию о типе массива можно получить только если массив статический и находится в той же области видимости что и sizeof. В ином случае это просто указатель без дополнительной информации. Поэтому большинство современных источников выступают против использования массивов.

    Можете сделать как-то так, чтобы принимать любые массивы:
    #include <iostream>
    #include <type_traits>
    
    template <typename T>
    typename std::enable_if<std::is_array<T>::value>::type
    func(T& a)
    {
        std::cout << "func sizeof(a)=" << sizeof(a) << '\n';
    }
    
    int main()
    {
        char a[2][10]{ "test1","test2" };
        std::cout << "sizeof(a)=" << sizeof(a[0]) << '\n';
        func(a[0]);
    }
    Ответ написан
    Комментировать
  • Функций и массивы в С?

    @MiiNiPaa
    #include <algorithm>
    #include <iostream>
    
    template <size_t N>
    int func(int (&array)[N])
    {
        return std::accumulate(std::begin(array), std::end(array), 0);
    }
    int main()
    {
        int sample[] {1,2,3};
        std::cout << func(sample) << '\n';
    }
    Ответ написан
    Комментировать
  • Где почитать про стили кодирования в С / Objective C?

    @MiiNiPaa
    про правильную индентацию
    Книг по несуществующему предмету не существует.

    Какие стили наиболее распространены сегодня?
    Посмотрите наиболее популярные проекты на гитхабе.

    Какой материал/книгу хорошо почитать
    Стайлгайд по текущему проекту. Если будете работать профессионально, будете встречать и писать код оформленный во всех этих стилях (хорошо если не одновременно)
    Ответ написан
    Комментировать
  • Как осуществить учето пробелов при вводе строки в C++?

    @MiiNiPaa
    scanf не учитывает пробелы

    Вы просто не умеете его готовить. scanf("%[^\n]", strk);

    Как вы используете gets (которая кстати удалена из С)? Попробуйте использовать fgets вместо него.
    Ответ написан
    Комментировать
  • Как посчитать строки в динамическом массиве?

    @MiiNiPaa
    printf("%d", len_text);
    Радостно выведет значение указателя на функцию len_text. Функции вызывать надо.

    Также огромное количество выделений памяти. Код можно назвать Изнасилование кучи
    Ответ написан
    2 комментария
  • Как правильно очистить память?

    @MiiNiPaa
    buffer = (char*)malloc(sizeof(char));Выделяет память для хранения одного символа.
    Пишется туда больше одного символа, получаем классическое переполнение буфера, которое очевидно повреждает какую-то информацию необходимую для корректного удаления.
    + буфер созданый на строке 7 никогда не освобождается

    И чем вам strspn/strcspn не угодили?
    Ответ написан
    2 комментария
  • Как работают макросы в c?

    @MiiNiPaa
    __DATE__, __LINE__ и прочее подобное подставляются самим препроцессором. Реализацию можно посмотрев только скачав исходники компилятора.
    Ответ написан
    Комментировать