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

    @res2001
    Developer, ex-admin
    if(std::strpbrk(String.c_str(), " ,.?") != nullptr_t)
    {
    }
    Ответ написан
    Комментировать
  • Как повторно просить ввести данные пока не введут верные?

    @res2001
    Developer, ex-admin
    Не о том спрашиваете.
    Любой цикл можно использовать:
    for(;;) {...}
    while(true) {...}
    do {...} while(true)

    Выходить из цикла с помощью break, когда ввод будет нормальный или изменить условие цикла.
    На самом деле вечный цикл в данном случае не нужен. Лучше всего предусмотреть, например, 3 попытки ввода, и если не удачно - завершаемся. В этом случае for() подойдет лучше всего.
    В целом в С/С++ циклы for и while имеют одинаковую функциональность, но for более приспособлен для счетчиков и т.п., т.к. в нем инициализация, условие и концовка цикла собраны в одной строке (более компактно, чем while). То же самое можно сделать и в while, но инициализацию и концовку придется написать отдельно.
    Ответ написан
    1 комментарий
  • Где ошибка в програме?

    @res2001
    Developer, ex-admin
    Этот вопрос лучше всего задать компилятору - он вам скажет где ошибка. Просто откомпилируйте программу.
    Если вам будет не понятно сообщение компилятора, то приложите его сюда вместе с кодом. Так будет всем проще.
    Если не считать странных пустых скобок при определении x и y, то ошибка в 0,345 - разделитель дробной части в плюсах точка. Так же не понятно выражение: (1, 64 - 2*y) - оно откомпилируется без ошибок, но вычислит ли оно то что вы задумали - врят ли: наверняка вы имели ввиду (1.64 - 2*y) - не правильный разделитель дробной части и лишний пробел, то же с 12.6, 3/7 - даст в результате 0, т.к. это целочисленное деление.
    Ответ написан
    Комментировать
  • Как решить ошибки в коде?

    @res2001
    Developer, ex-admin
    Посмотрите, как правильно обращаться с перечислениями: https://en.cppreference.com/w/cpp/language/enum
    Тот вариант обращения к перечислению, который вы используете в коде называется Scoped enumerations. Чтоб его использовать вы должны объявить Direction так: enum class Direction {....
    Если же перечисление объявлять так как у вас, то обращаться к нему нужно без указания Direction.
    Ответ написан
  • Ошибка «Системе не удается найти указанный путь». C++ Как пофиксить?

    @res2001
    Developer, ex-admin
    У вас программа не собралась, поэтому и файл не найден. Смотрите внимательно окно вывода компилятора внизу, там написано
    0 - successed, 1 - failed

    Это означает ошибка при компиляции. Дальше смотрите окно "error list", там будет указана конкретная ошибка(и).
    В данном случае ошибку вам уже обозначил Roman выше.
    Ответ написан
    Комментировать
  • Почему в массив размером N можно положить больше чем N элементов?

    @res2001
    Developer, ex-admin
    В malloc при передаче в качестве аргумента нуля возвращаемое значение не определено (implementation-defined). Так что фиг знает что там вам вернул маллок. Но раз программа не падает, то, возможно, он вернул какой-то указатель на стек, а в стеке у вас есть ~8МБ - развлекайтесь.
    В общем не нужно так делать. На другом компиляторе (или на том же, но другой версии) поведение может быть совсем другим.
    Ответ написан
    Комментировать
  • Как в данном случае записывать результат недоигранной игры в бинарный файл?

    @res2001
    Developer, ex-admin
    Сохраняйте имена игроков и массив cells. Т.к. вся информация символьная, то ваш бинарный файл будет вполне себе текстовый. Есть смысл и делать его именно текстовым, где в каждой строке будет находится один элемент данных.
    Ответ написан
    Комментировать
  • Как кидать исключения при работе с try catch?

    @res2001
    Developer, ex-admin
    Сишные функции не вызывают исключений. В Си их просто нет. Поэтому помещать их в try/catch нет смысла - проверяйте возвращаемые значения по старинке. Если хотите, можете написать обертки для стандартных функций, генерирующие исключения в случае ошибки. А еще лучше использовать std::fstream - вы же пишите на С++, так и пользуйтесь плюсовой стандартной библиотекой, а не Сишной.
    void foo() {
        int *smth;
        try {
            smth = new int[100];
            if (5 < 4) {
                std::runtime_error("Беда");
            }
        } catch (std::runtime_error &e) {
            e.what();
        }
        delete[] smth;
    }

    new генерирует std::bad_alloc, если произойдет исключение - память не выделилась и ничего удалять не надо.
    Ответ написан
    2 комментария
  • Длина файла в c++?

    @res2001
    Developer, ex-admin
    Не нужно вам так: for(i =0; i<=длина файла -1;i++)
    Читайте пока не будет eof() или ошибки, обычно делают примерно так:
    while(f.good()) { f.read() }

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

    @res2001
    Developer, ex-admin
    1. std::stoi/std::strtoi и подобные функции
    Примеры тут: https://en.cppreference.com/w/cpp/string/basic_str...
    2. Что именно вам не понятно в применении констант? Приведите пример непонятного?
    const int bad_id =  -1;
    ...
    int new_id = bad_id;

    Смысл в том, чтобы применять не саму константу (в примере -1), а ее именованный эквивалент, имя которого должно иметь смысл для читающего код. При этом по коду у вас может быть несколько одинаковых констант с разным смыслом. Для каждой такой константы нужно создать свою символьную константу.
    https://ravesli.com/urok-37-simvolnye-konstanty-co...
    Ответ написан
    Комментировать
  • Как сделать чтобы введенное число не было больше 1000?

    @res2001
    Developer, ex-admin
    Если по простому, то вам нужно проверять введенное значение и если оно выходит из нужного диапазона повторять попытку ввода.
    Если же хочется, чтоб пользователь в принципе не мог ввести число вне диапазона, то нужно выкинуть весь стандартный ввод/вывод, читать ввод посимвольно на каждый введенный символ проверять диапазон, если очередной прочитаный символ цифра и получившееся число вместе с новой цифрой укладывается в диапазон, то самому ее допечатывать на экране, если не укладывается - игнорировать (отбрасывать и не печатать). Как-то так. Забейте, овчинка не стоит выделки, используйте первый вариант. Хотя это было бы полезным опытом, если вы хотите научиться программировать.
    Ответ написан
    1 комментарий
  • Как решить проблему с устаревшей функцией?

    @res2001
    Developer, ex-admin
    Установите libpng из пакетов в систему, поставьте к ней dev пакет и используйте ее в своем проекте.
    В пакетах содержится версия libpng совместимая с вашей системой.
    glibc тесно связана с ядром, поэтому просто так ее не собрать и версию не изменить. Она идет в комплекте с ядром.
    Ответ написан
  • Можно ли отлавливать инжект dll в приложение?

    @res2001
    Developer, ex-admin
    Изучите методы инжектирования и повесьте свои хуки на соответствующие системные вызовы.
    Посмотрите сюда для примера: https://habr.com/ru/company/icl_services/blog/324718/
    https://docs.microsoft.com/ru-ru/windows/win32/api...
    https://docs.microsoft.com/en-us/windows/win32/api...
    Ответ написан
  • Почему при делении 0 на -5 получается -0?

    @res2001
    Developer, ex-admin
    Можно делать примерно так:
    #include <cfloat>
    ...
    if (res > -DBL_EPSILON && res < DBL_EPSILON) res = 0;
    cout << res;

    В качестве DBL_EPSILON вы можете выбрать другое число, которое вам более удобно.
    Красиво тут не получится. Так же как бесполезно делать точное сравнение (==) двух чисел с плавающей точкой.
    Ответ написан
    2 комментария
  • Как создать компоратор для вектора структур?

    @res2001
    Developer, ex-admin
    Помогите написать компоратор для этого дела или объясните, что можно написать по-другому.

    Какие проблемы то?
    Вот как описал сам процесс сравнения так и реализуешь компаратор.
    Т.е. сначала проверяешь баллы. Если баллы не равны, сразу возвращаешь соответствующее значение.
    Если баллы равны начинаешь проверять name.
    Ответ написан
  • Как проверить на int?

    @res2001
    Developer, ex-admin
    У вас же есть некий диапазон корректных значений, которые вы ждете от пользователя?
    Перед вводом присвойте переменной некорректное значение.
    После ввода проверяйте значение на корректность.
    Вот и вся проверка.

    Вообще любой пользовательский ввод надо проверять на корректность, а так же содержимое конфигов и т.п.
    Ответ написан
    2 комментария
  • Как выводить русские буквы в консоль на С++?

    @res2001
    Developer, ex-admin
    Вечная проблема :-)
    Каждый начинающий виндовый С++ программист должен пройти через это!

    1. Виндовая командная строка по умолчанию имеет кодировку cp866 (да-да, не cp1251). Не рекомендую выводить в UTF8, т.к. cmd до сих пор коряво работает с этой кодировкой.
    2. cmd и консоль powershell - это разные консоли
    3. Компилятор и стандартная библиотека (cin/cout) никак не конвертируют кодировки при вводе/выводе.
    (Возможно преобразование можно как-то задать, но по умолчанию это не делается.)
    4. Компилятор никак не преобразует ваши текстовые строки в программе при сборке, т.е. в какой кодировке вы написали строковую константу, та же кодировка будет выведена на консоль. Таким образом - имеет значение в какой кодировке у вас исходники!
    5. Кодировку в консоли можно поменять из самой консоли командой chcp. Часто так и делают. В русской винде 2 широко используемые кодировки консоли: cp866 и cp1251. Не стоит надеяться на то, что программа всегда будет запускаться только при одной кодировке.

    Исходя из вышенаписанного:
    1. Исходники всегда пишем в UTF8
    2. Перед выводом всегда преобразуем UTF8 в кодировку консоли. После ввода - то же самое. Есть соответствующие функции в WinAPI.
    3. Никогда не меняем принудительно кодировку консоли - это не удобно пользователям программы

    Для самого простого варианта - вы можете написать исходники в cp866 и по умолчанию в cmd у вас все будет нормально с кодировками.

    Удачи!
    Ответ написан
    Комментировать
  • Создание случайной строки в момент компиляции?

    @res2001
    Developer, ex-admin
    1.Текущий timestamp часто берут для инициализации стандартного С/С++ генератора случайных чисел.
    Пример можно найти, например тут: https://en.cppreference.com/w/cpp/numeric/random/srand

    2.Вам придется реализовать свой собственный constexpr rand(), т.к. стандартный не constexpr.

    3.Вам не нужно в принципе вызывать MessageBox и любые подобные функции на стадии компиляции программы.
    constexpr функции выполняются компилятором, поэтому на них накладываются достаточно серьезные ограничения. Когда программа исполняется вместо вызова constexpr функции уже стоит ранее вычисленное компилятором значение.
    Ответ написан
    8 комментариев
  • Как включить программу в автозагрузке C++?

    @res2001
    Developer, ex-admin
    Последний параметр в RegSetValueEx для REG_SZ должен содержать длину строки + 1 на завершающий нулевой символ (strlen(arr)+1) (https://docs.microsoft.com/en-us/windows/win32/api...)

    Не используйте MAX_PATH - это древний уже неактуальный вариант. Читайте до просветления: https://docs.microsoft.com/en-us/windows/win32/fil...
    Ответ написан
    Комментировать
  • Как отпарить POST запрос на сервер на чистом Visual С++ или WinApi по HTTPS и HTTP протоколам?

    @res2001
    Developer, ex-admin
    Можно использовать функционал микрософтовской библиотеке wininet. Есть по умолчанию в винде. Можете начать отсюда:
    https://docs.microsoft.com/en-us/windows/win32/api...
    https://docs.microsoft.com/en-us/windows/win32/api...

    Правда я не знаю, что там у нее с поддержкой HTTPS.
    Ответ написан
    Комментировать