Ответы пользователя по тегу C
  • Как перевести из int в char в СИ?

    Если прямо ответить на вопрос, то в предположении, что вы спутали только символы и строки, вот так
    int i=5;
    
    putchar ('0'+i);


    но подозреваю, что нужно на самом деле совсем не это, т.к. спутали вы скорей всего больше, чем только символы и строки.
    Ответ написан
    Комментировать
  • Как писать на C в Visual Studio 2017?

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

    У вас классическое переполнение стекового буфера (stack buffer overflow aka buffer overrun).
    https://en.wikipedia.org/wiki/Stack_buffer_overflow

    Вы не проверяете результат fopen и fscanf() и не контролируете длину данных, считываемых в буфер word фиксированного размера. В данном случае либо fscanf ничего не может считать, и в cryption() вы пытаетесь шифровать мусор, который не заканчивается нулевым байтом, что приводит к переполнению буфера word либо считывается более 10 байт, из-за чего переполняется буфер word. Поскольку буфер объявлен в локальных переменных функции, это приводит к повреждению стека.

    Всегда контролируйте возврат из функции (fopen(), scanf(), fscanf(), malloc() в вашем случае) + ограничьте размер вводимой строки размером буфера через форматный спецификатор ("%9s" например)
    Ответ написан
    Комментировать
  • Как работать с делением и типами в Си?

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

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

    if(!(f1 && f2)) {

    не сработает, т.к. в случае сбоя open() возвращается -1. В третьих вы используете strlen для содержимого буфера который был получен не строчной функцией и скорей всего не содержит '\0' (buf[bytes] = 0 надо было написать до strlen).
    Ответ написан
    Комментировать
  • Почему getchar() читает все символы из stdin?

    getchar() выполняет буферизированный ввод, при вызове getchar() вызывается read(), который считывает данные в буфер, затем на последующих вызовах getchar() данные возвращаются из буфера без вызова read(). Вместе с select/poll/epoll правильней напрямую использовать read().
    Ответ написан
    Комментировать
  • Как динамически указать длину поля для вывода в printf?

    Используйте snprintf чтобы сформировать форматную строку

    char fsbuf[256];
    ...
    snprintf(fsbuf, sizeof(fsbuf), "%%%ds", (int)strlen(name)+3);
    printf(fsbus, name);


    но что-то мне подсказывает, что задачу вы для себя сформулировали неверно.
    Ответ написан
  • Почему не читаются числа, записанные в одну строку с разделением?

    Например, потому что после
    fscanf(f, "%d", &N);
    остается \n в буфере ввода.
    Лучше не мешайте fgets и fscanf, из файла читайте всегда fgets'ом, а считанную в буффер строку разбирайте sscanf'ом.
    Ответ написан
    Комментировать
  • Как сделать безлимитный массив?

    В C не бывает безлимитных массивов. Ничего безлимитного вообще нигде не бывает, а в C массив это именно статический массив фиксированного размера, вы создаете массив из одного char'а. Обычно делается динамический буфер который растет от некоторого начального размера и кратно увеличивается по мере необходимости (обычно в 1.5 или 2 раза), можно растить буфер через realloc, как-то примерно так

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    #define BUFSIZE 64
    
    char * getl() {
        char *buf;
        size_t bufsize = BUFSIZE;
        size_t inbuf = 0;
    
        buf = malloc(bufsize);
        if(!buf) return NULL; /* ошибка */
        do {
            if(inbuf >= bufsize - 1){ /* если в буфере кончается место */
                bufsize = bufsize + (bufsize>>1); /* умножение на 1.5 */
                if(!(buf = realloc(buf, bufsize))) return NULL; /* пытаемся увеличить буфер до нового размера, проверяем получилось ли */
            }
            if(!fgets(buf+inbuf, bufsize-inbuf, stdin)) break;
            inbuf +=  strlen(buf+inbuf);
        } while(buf[inbuf - 1] != '\n');
        return buf;
    }
    
    int main(){
        char * l;
    
        l = getl();
        if(l){
            printf("line: %s\nstrlen: %zd\n", l, strlen(l));
            free(l);
        }
        
        return 0;
    
    }
    Ответ написан
    Комментировать
  • Как считать два байта числа?

    Красиво и универсально никак, наиболее совместимый способ примерно такой:

    #include <stdint.h>
    #if defined (__WIN32__)
    #include <Winsock2.h>
    #else
    #include <arpa/inet.h>
    #endif
    
    uint16_t read_16(FILE * f)
    {
        uint16_t ui16;
        fread(&ui16, 1, 2, f);
        return ntohs(ui16);
    }
    
    uint32_t read_32(FILE * f)
    {
        uint32_t ui32;
        fread(&ui32, 1, 4, f);
        return ntohl(ui32);
    }
    Ответ написан
    Комментировать
  • Чем отличается динамическая библиотека от статической?

    Статическая библиотека это фактически архив объектных файлов, который используется в процессе статической линковки. В результате статической линковки из многих объектных файлов получается один исполняемый, запускается статическая линковка в момент создания исполняемого файла.

    Динамическая библиотека это фактически исполняемый файл (т.е. DLL и EXE в Windows имеют одинаковый формат). Динамическая линковка запускается в момент создания процесса (когда вы запускаете исполняемый файл на выполнение), линкуются между собой несколько исполняемых файлов каждый раз, когда создается новый процесс. Так же возможна динамическая линковка уже после запуска, т.е. новая библиотека может быть подгружена в адресное пространство ужа работающего процесса.

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

    Кто-то что-то путает, т.к. для этого кода надо, чтобы было выделено 60 байт, скорей всего выделяется 64.
    Этот код берет байтовый массив
    |00|01|02|..|56|57|58|59|
    берет из него по 4 байта и над группой из 4х байт выполняет преобразование, ксоря в этой группе все биты с r кроме определенного. Затем сдвигается на 8 байт, берет следующие 4 байта и т.д.
    Ответ написан
    Комментировать
  • Почему различаются коды программы после gcc -S в Ubuntu и Windows?

    Основное отличие именно в коде, что под Windows ты скомпилировал код как 32-битный, а под Ubuntu - 64-битный. Остальные отличия косметические, на уровне информации для линковщика.
    Ответ написан
    3 комментария
  • Как правильно установить в визуал студио СИ?

    Если вы вводите символ и enter, то первый scanf вернет символ, второй scanf вернет '\n'. Хоть в Visual Studio, хоть в GNU C, потому что вы его ввели и scanf работает с буферизованным вводом.
    Ответ написан
  • Не могу найти ошибку в использовании long double в C?

    Вы выводите x как float (%f), а он у вас double, double это %lf. Из-за этого второе число оказывается сдвинуто на 4 байта, т.е. выводится мусор.
    Ответ написан
    2 комментария
  • Может ли размер memory pool быть меньше размера страницы?

    Все зависит от того, что вы подразумеваете под словом "выделить", выделить от кого кому? Операционная система приложению выделяет память постранично. На уровне приложения для управления памятью как правило организуется динамическая память в виде кучи. Соответственно, память для кучи выделяется постранично, а из кучи - любого размера. Memory pool может быть организован и поверх кучи, например если вы создаете хэш-таблицу, можно взять память постранично от ОС (VirtualAlloc / mmap), а можно - из кучи (new, malloc, HeapAlloc, etc).

    P.S. Размер страницы может быть разный, но фиксированный. Сейчас многие системы поддерживают huge page'ы, где одна страница может занимать достаточно большой кусок памяти, например 2MB или 1GB. Но пользоваться этим надо с большой осторожностью, т.к. пейджинация на таких страницах - очень медленная операция.

    P.P.S. В качестве альтернативы memory pool можно использовать организацию кучи на bitmap'ах с фиксированными размерами чанков, фактически это примерно то же самое.
    Ответ написан
    4 комментария
  • Из support в developer?

    Если вы хотите уйти от рутины, то программирование в большом и долгом проекте это, скорей всего, не для вас. Конечно, в начале будет и новизна и интересные задачи и новые знания, но в целом это конвеер и задачи вы, скорей всего, будете решать достаточно однотипные. Если хотите разнообразных задач, где, к тому же, наверняка пригодится и ваш опыт поддержки - ищите или создавайте небольшую команду / стартап. Либо можете начать с разработки а потом двигаться в сторону общения с заказчиком (например, в роли product owner'а, ваш опыт поддержки будет очень полезен).
    Ответ написан
  • Как узнать какие функции доступны в dll?

    dumpbin -exports example.dll
    но в общем случае ничего не делать, т.к. помимо функции надо знать какие у нее аргументы и какие соглашения вызова используются, что в принципе не всегда возможно.
    Ответ написан
    Комментировать