Ответы пользователя по тегу C
  • Когда вызывается malloc() или new, то на самом деле вызывается какая-то win api функция?

    @abcd0x00
    Первый раз вызывается какая-то функция операционной системы (в зависимости от системы, есть же не только Windows) и запрашивается очень большой блок (даже если запрашиваешь мало). Потом из него выделяется то, что ты запросил, и в нём же запоминается информация об этом (метаданные). При последующих вызовах этот первый блок продолжает нарезаться, пока в нём хватает памяти (может на всё время хватить). Во время освобождения памяти этот блок остаётся занятым, просто в нём какие-то места помечаются свободными для повторного использования.
    Ответ написан
    Комментировать
  • Как хранить результат вызова системной команды?

    @abcd0x00
    Самое оптимальное будет - добавить в команду, передаваемую в system(), перенаправление вывода в файл, а потом этот файл прочитать через fopen(). После всего удалить файл через remove().
    Ответ написан
    Комментировать
  • Код C, который не будет работать в C++?

    @abcd0x00
    int f()
    {
        return 1;
    }
    
    int main(void)
    {
        f(1, 2);
        return 0;
    }
    Ответ написан
    Комментировать
  • Где ошибка в коде(Динамичные структуры данных)?

    @abcd0x00
    /**/
          if (t % 2 == 0)
          {
            Node *tmp = (Node*)malloc(sizeof(Node));
            p3->next = tmp;
            tmp->data = p3->data;
            tmp->next = NULL;
          }

    Тут утечка памяти. Когда ты делаешь p3->next = tmp , бесследно пропадает указатель, который был в p3->next .
    Ответ написан
  • Чего то я не понял с функциями из библиотеки string.h?

    @abcd0x00
    Все функции из пакета возвращают число int.

    Во-первых, string.h - это не пакет, а набор объявлений для группы функций из стандартной библиотеки функций языка C. То есть библиотека включает в себя вообще все функции, а файлы с объявлениями позволяют подключать (объявлять) их только нужными группами.

    Во-вторых, не все функции для работы со строками возвращают int. Это ты сам придумал, где-то что-то перепутав. Строковые функции бывают разными - и возвращающими int, и возвращающими char *, и возвращающими size_t. Функция strstr() возвращает char * - указатель на начало найденной подстроки, либо NULL, если подстрока не найдена.

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

    @abcd0x00
    Вызов gets_s() проскакивает потому, что при вводе по cin ты нажимаешь Enter в конце. Когда нажимаешь Enter, в поток посылается символ перевода строки и остаётся там. А потом gets_s() видит его и считает введённой строкой. Поэтому ты должен после cin выполнить cin.get()

    Пример
    #include <iostream>
    
    using namespace std;
    
    int main()
    {
        int n;
        char c;
    
        cin >> n;
        cin.get(c);
    
        cout << n << " " << int(c) << endl;
        return 0;
    }


    Вывод
    [guest@localhost cpp]$ .iso++ t.cpp -o t
    [guest@localhost cpp]$ ./t
    123
    123 10
    [guest@localhost cpp]$


    Вот это число 10 - это код символа \n (символа перевода строки).
    Ответ написан
    Комментировать
  • Как передать значение переменной из одной функции в другую?

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

    Пример
    #include <stdio.h>
    
    int func1()
    {
        return 5;
    }
    
    int func2(int x)
    {
        return x * 2;
    }
    
    int func3(int x)
    {
        return x * 3 + 1;
    }
    
    int main(void)
    {
        printf("%d\n", func3(func2(func1())));
        return 0;
    }


    [guest@localhost c]$ .ansi t.c -o t
    [guest@localhost c]$ ./t
    31
    [guest@localhost c]$

    Ответ написан
    Комментировать
  • Почему не срабатывает код?

    @abcd0x00
    Поставь себе нормальную среду с нормальным компилятором. VS просто пытается пользователя к себе привязать, навязывая свои "безопасные" функции, которые есть только в ней.
    Ответ написан
    Комментировать
  • Как вывести первые буквы слов строки?

    @abcd0x00
    Выводит первые буквы слов.
    #include <stdio.h>
    #include <ctype.h>
    
    int main(void)
    {
        int c, wassp;
    
        wassp = 1;
        while ((c = getchar()) != EOF) {
            if (isspace(c))
                wassp = 1;
            else if (wassp) {
                wassp = 0;
                putchar(c);
            }
        }
        putchar('\n');
        return 0;
    }


    Вывод
    [guest@localhost c]$ .ansi t.c -o t
    [guest@localhost c]$ echo "abcd efgh ijkl" | ./t
    aei
    [guest@localhost c]$
    Ответ написан
    Комментировать
  • Откуда узнавать о библиотеках?

    @abcd0x00
    Свежие черновики стандартов C
    www.open-std.org/JTC1/SC22/WG14

    Стандарт C89 (черновик)
    flash-gordon.me.uk/ansi.c.txt

    Прочитай английские страницы по C
    https://en.wikipedia.org/wiki/C_%28programming_lan...
    https://en.wikipedia.org/wiki/ANSI_C

    Это FAQ по вопросам из comp.lang.c
    c-faq.com

    Ещё можешь на канал #c зайти на irc.freenode.net, там обычно собирают всю последнюю информацию по языку.
    Ответ написан
    Комментировать
  • Чистый С и переменное число аргументов?

    @abcd0x00
    Цель моей задачи овладеть макросами

    А при чём тут макросы? Ты, возможно, не знаешь, но getc() и getchar() тоже реализованы часто в виде макросов. Чтобы ими пользоваться, не нужно этого знать. Тут то же самое.

    Все функции с переменным числом аргументов основаны на одном принципе: есть обязательный аргумент, несущий в себе информацию о необязательных. Он может быть строкой, но может быть и числом, а может быть вообще структурой. При входе в функцию из него извлекается информация о необязательных аргументах (их количество и тип каждого). А потом эта информация используется для получения самих аргументов.

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

    Чтобы адреса и размеры вручную не вычислять каждый раз, сделаны удобные макросы - va_start(), va_arg(), va_end().
    Ответ написан
    Комментировать
  • Чем отличается спецификатор от модификатора C/C++?

    @abcd0x00
    Есть квалификатор, спецификатор и модификатор.
    Квалификатор и модификатор - это одно и то же.

    Спецификатор - то, что задаёт тип:
    int
    short
    long
    struct x
    union y

    Модификатор - то, что меняет заданный тип:
    const
    volatile
    Ответ написан
    Комментировать
  • Почему char занимает 1 байт, а строка с одним символом - 2 байта?

    @abcd0x00
    Нуль-символ обозначает конец строки. То есть строку можно читать, посимвольно смещаясь вправо, пока не встретится конец. Таким образом её длину хранить не нужно.
    А теперь представь строку на миллиард символов. Для такой строки затраты на хранение её длины остаются теми же - один байт в котором записан нуль-символ.
    А вот если бы длина строки хранилась в переменной, то нужно было бы следить за размером этой переменной, потому что на слишком длинных строках числовое значение длины не помещалось бы в переменную.
    Ты думаешь, почему Дельфи такой медленный язык (программа The Bat! работает медленно), потому что там этого нет, из-за чего происходит множество лишних вычислений.
    Ответ написан
  • Разница работы с памятью С и С++?

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

    @abcd0x00
    Как сделать бинарный поиск на си?

    Он уже сделан - функция bsearch().
    Ответ написан
    Комментировать
  • Си. Как сделать функцию, умножающую число?

    @abcd0x00
    Тебе, конечно, предложили с указателем, но надо сделать без указателя.
    int func(int x)
    {
        return x / 10;
    }
    
    ...
    
        a = func(a);
    Ответ написан
    1 комментарий
  • Какой смысл типа union?

    @abcd0x00
    Можно делать универсальные объекты для хранения.

    Пример:
    Код
    #include <stdio.h>
    
    struct a {
        int a, b, c;
    };
    
    struct b {
        double a, b, c, d;
    };
    
    struct c {
        char s[100];
    };
    
    struct d {
        int a, b, c;
        double n[10];
    };
    
    union x {
        struct a a;
        struct b b;
        struct c c;
        struct d d;    
    };
    
    typedef struct {
        enum { A, B, C, D } type;
        union x value;
    } Obj;
    
    int main(void)
    {
        Obj objects[100], *pobj;
        int n;
        int i;
    
        objects[0].type = A;
        objects[0].value.a.a = 1;
        objects[0].value.a.b = 2;
        objects[0].value.a.c = 3;
    
        objects[1].type = B;
        objects[1].value.b.a = 1.5;
        objects[1].value.b.b = 2.5;
        objects[1].value.b.c = 3.5;
        objects[1].value.b.d = 4.5;
    
        objects[2].type = C;
        sprintf(objects[2].value.c.s, "abc");
    
        objects[3].type = A;
        objects[3].value.a.a = 4;
        objects[3].value.a.b = 5;
        objects[3].value.a.c = 6;
    
        n = 4;
        
        for (i = 0; i < n; i++) {
            pobj = objects + i;
            switch (pobj->type) {
            case A:
                printf("A: %d %d %d\n",
                       pobj->value.a.a,
                       pobj->value.a.b,
                       pobj->value.a.c);
                break;
            case B:
                printf("B: %g %g %g %g\n",
                       pobj->value.b.a,
                       pobj->value.b.b,
                       pobj->value.b.c,
                       pobj->value.b.d);
                break;
            case C:
                printf("C: %s\n", pobj->value.c.s);
                break;
            case D:
                printf("D: %g\n", pobj->value.d.n[0]);
                break;
            }
        }
    
        return 0;
    }



    Вывод
    [guest@localhost c]$ .ansi t.c -o t
    [guest@localhost c]$ ./t
    A: 1 2 3
    B: 1.5 2.5 3.5 4.5
    C: abc
    A: 4 5 6
    [guest@localhost c]$
    Ответ написан
    Комментировать
  • Как перенести алгоритм вычисления хеша на lua?

    @abcd0x00
    Или хотя бы расскажите, что он делает.

    1. Он добавляет 8-битное значение к 32-битному значению.
    2. Затем берёт у этого 32-битного значения 13 бит слева и переставляет их направо.
    3. Потом из исходного 32-битного значения вычитается полученное 32-битное значение.
    4. Потом всё повторяется, пока есть 8-битные значения.

    Если бы ты запустил это в дебаггере, то увидел бы по шагам, что происходит в цикле.
    Ответ написан
    Комментировать
  • Зачем нужны переменные перечисления?

    @abcd0x00
    Основное отличие от символических констант в том, что перечисления имеют другую область видимости
    #include <stdio.h>
    
    int main(void)
    {
        enum { A, B, C };
        {
            enum { A = 10 };
            printf("%d\n", A);
        }
        printf("%d %d %d\n", A, B, C);
        return 0;
    }


    [guest@localhost c]$ .ansi t.c -o t
    [guest@localhost c]$ ./t
    10
    0 1 2
    [guest@localhost c]$

    А назначение перечислений - в быстром создании констант с осмысленными именами. Дело не в том, что они идут по порядку, а в том, что по умолчанию они различаются. То есть в пределах одного перечисления не нужно заботиться о том, чтобы там что-то чему-то не было равно.
    Ответ написан
    Комментировать
  • Как принимает recv?

    @abcd0x00
    Вообще, там есть средства для проверки сокета на активность. Можно поставить временной порог для отличия частей одной записи от разных записей. Но теоретически это ненадёжно.

    Так что используй TLV
    https://en.wikipedia.org/wiki/Type-length-value
    Ответ написан
    Комментировать