C++ Гайд Исправление неверной раскладки текста - исходник / плюс вопрос!!!

Легенда форума
Статус
Оффлайн
Регистрация
10 Дек 2018
Сообщения
4,381
Реакции[?]
2,284
Поинты[?]
189K
Привет.
Ради практики решил написать какую-нибудь несложную программу на плюсах, вот, написал то, что видите в названии. Не видел, чтобы такое делали на плюсах.
Исходник:
.cpp
C++:
#include <iostream>
#include <string>
#include "sheet.h"

using namespace std;

int GetSymbolType(int symbol, int textSymbol, string text)
{
    if (text[textSymbol] == ENG_SYMBOLS[symbol])
        return 1;

    if (text[textSymbol] == ' ')
        return 2;

    return 0;
}

int main()
{
    setlocale(LC_ALL, "Russian");

    string text{ };
    cout << endl <<  "English Input: ";
    getline(cin, text); // gets line with spaces

    string result{ };


    for (int count{ }, symbol{ }; count <= text.length(); ) { // while count != text's length

        switch (GetSymbolType(symbol, count, text)) {

            case 1: ++count,
                    result.push_back(RU_SYMBOLS[symbol]), // if we hit symbol - push ru alt to back of result array
                    symbol = 0; break;
            case 2: ++count,
                    result.push_back(' '),
                    symbol = 0; break;

            default: ++symbol; break; // if symbol wasn't hit'ted - try next
        }
    }

    cout << "Output: " << result << endl;

    result.clear(), text.clear(), count = 0, symbol = 0;
    main();
}
.h
C++:
#pragma once


using namespace std;

const string ENG_SYMBOLS{ "qwertyuiop[]asdfghjkl;'zxcvbnm,.QWERTYUIOP[]ASDFGHJKL;'ZXCVBNM,." }; // 32 + 1
const string RU_SYMBOLS{ "йцукенгшщзхъфывапролджэячсмитьбюЙЦУКЕНГШЩЗХЪФЫВАПРОЛДЖЭЯЧСМИТЬБЮ" }; // 32 + 1
2021-09-07_224828.png
Программа верно обрабатывает пробелы и заглавные/прописные буквы. Символы и цифры - нет, но это легко исправить.


Хотел спросить у вас как можно лучше реализовать какие-то моменты, да.
И ещё - можете посоветовать что можно написать, но не слишком сложное.
Irval, жду твоих золотых советов)
 
Последнее редактирование:
Олдфаг
Статус
Оффлайн
Регистрация
18 Фев 2019
Сообщения
2,826
Реакции[?]
1,853
Поинты[?]
24K
@@Irval, жду твоих золотых советов)
1. Стоило сделать перевод и с русской раскладки на английскую.
2. Нет необходимости в использовании дополнительных заголовочных файлов, учитывая столь небольшой объем проекта. Можно было просто объявить константы с раскладками внутри блока main.
3. Очень зря используется инициализация с помощью фигурных скобок {}. Это может не работать на некоторых компиляторах, или же работать не так, как задумывалось. Советую воспользоваться обычной операцией присваивания.
4. Сравнивание в for'е достаточно неординарное, что немного затрудняет чтение кода, гораздо лучше было обойтись перебором i [0; len).
5. Неизвестные символы заменяются на пустоту, это не есть хорошо.
6. Не понял, откуда вообще взялась эта переменная. Да и очистка на данном этапе не является необходимой.
7. В конце находится неоправданная рекурсия. Настоятельно советую использовать цикл while.
C++:
#include <iostream>
#include <string>
#include <conio.h>
#include <windows.h>

using namespace std;

int main()
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    setlocale(LC_ALL, "RU");
    const string ruAlph = "йцукенгшщзхъфывапролджэячсмитьбю.ёЙЦУКЕНГШЩЗХЪФЫВАПРОЛДЖЭЯЧСМИТЬБЮЁ.!\"№;%:?*/,";
    const string enAlph = "qwertyuiop[]asdfghjkl;'zxcvbnm,./`QWERTYUIOP[]ASDFGHJKL;'ZXCVBNM,.~/!@#$%^&*|?";

    do {
        system("cls");
        
        string text, result;
        cout << "Input: ";
        getline(cin, text);

        bool en2ru = text[0] >= 'A' && text[0] <= 'z';

        for (int i = 0; i < text.length(); i++) {
            int enInd = en2ru ? enAlph.find(text[i]) : enAlph.npos, ruInd = !en2ru ? ruAlph.find(text[i]) : ruAlph.npos;
            if (enInd != enAlph.npos)
                result += ruAlph[enInd];
            else if (ruInd != ruAlph.npos)
                result += enAlph[ruInd];
            else
                result += text[i];
        }
        cout << result;
        _getch();
    } while (1);
}
 
Легенда форума
Статус
Оффлайн
Регистрация
10 Дек 2018
Сообщения
4,381
Реакции[?]
2,284
Поинты[?]
189K
2. Нет необходимости в использовании дополнительных заголовочных файлов, учитывая столь небольшой объем проекта. Можно было просто объявить константы с раскладками внутри блока main.
GetSymbolType тоже оттуда берёт символы, так что в мейне не получилось бы объявить)
3. Очень зря используется инициализация с помощью фигурных скобок {}. Это может не работать на некоторых компиляторах, или же работать не так, как задумывалось. Советую воспользоваться обычной операцией присваивания.
Ты про string? Вроде нормально работает, не знаю. В цикле фор тоже. Ни разу не видел проблем с юниформ инициализацией.
4. гораздо лучше было обойтись перебором i [0; len).
Немного не понял про что ты. Видимо ты не дописал эту часть)
5. Неизвестные символы заменяются на пустоту, это не есть хорошо.
Да, это я не учёл, хоть и хотел) Можно сделать копирование, если символ неизвестен и при этом symbol = 33 (кол-во перебранныъ символов).
6. Не понял, откуда вообще взялась эта переменная. Да и очистка на данном этапе не является необходимой.
А) Там должен был быть result, забыл ренеймнуть. Очистка нужна для последующей рекурсии.
7. В конце находится неоправданная рекурсия. Настоятельно советую использовать цикл while.
Можно и while, но я, если честно, не особо вижу разницу.
Спойлер: Моя версия программы
У тебя, если честно, получился сложный для чтения код)
Как я понял, заместо брутфорса символа (до тех пор, пока не найдётся подходящий), ты используешь .find, который, видимо, делает тоже самое, но самостоятельно. И ты не очищаешь стринги, что плохо. Тогда нужно использовать replace() для корректной замены символов.
Кроме этого - существенной разницы не вижу, ну, может быть потому, что лично для меня этот код очень трудночитаем.


В целом - спасибо за советы, кое-что я принял во внимание
 
Олдфаг
Статус
Оффлайн
Регистрация
18 Фев 2019
Сообщения
2,826
Реакции[?]
1,853
Поинты[?]
24K
Ты про string? Вроде нормально работает, не знаю. В цикле фор тоже. Ни разу не видел проблем с юниформ инициализацией.
Про int тоже, не помню точно на каких компиляторах, но это может инициализироваться, как -2^(n-1).
Немного не понял про что ты. Видимо ты не дописал эту часть)
Все правильно, просто лучше было бы написать for(int i=0; i < len; I++);
А) Там должен был быть result, забыл ренеймнуть. Очистка нужна для последующей рекурсии.
В каждой новой копии функции при рекурсии все переменные инициализируются заново внутри своего блока :)
Можно и while, но я, если честно, не особо вижу разницу.
Разница есть. Рекурсия занимает гораздо больше памяти, в то время, как цикл не будет занимать ещё места, создавая свои копии.
У тебя, если честно, получился сложный для чтения код)
Как я понял, заместо брутфорса символа (до тех пор, пока не найдётся подходящий), ты используешь .find, который, видимо, делает тоже самое, но самостоятельно. И ты не очищаешь стринги, что плохо. Тогда нужно использовать replace() для корректной замены символов.
Кроме этого - существенной разницы не вижу, ну, может быть потому, что лично для меня этот код очень трудночитаем
Мой код более оптимизирован, позже поймёте)
 
Легенда форума
Статус
Оффлайн
Регистрация
10 Дек 2018
Сообщения
4,381
Реакции[?]
2,284
Поинты[?]
189K
Про int тоже, не помню точно на каких компиляторах, но это может инициализироваться, как -2^(n-1).
Видимо какие-то допотопные компиляторы, которые неправильно поддерживают юниформ инициализацию. На компиляторе визуалки, v141, всё отлично работало и работает. Мне она больше нравится, т.к. не нужно вручную прописывать 0, 0.0 и т.п.. Все переменные сами инициализируются до нуля.
for(int i=0; i < len; I++);
Неа) Последний оператор в моём случае не нужен, т.к. count увеличивается только если был хитнут верный символ.
Почему именно i < len, а не i <= len - не понимаю, ведь тогда будет ещё один лишний символ. А в моём случае цикл будет бесконечно выполняться.
В каждой новой копии функции при рекурсии все переменные инициализируются заново внутри своего блока :)
Понятно. Этого я не знал, хоть это и само собой разумеющееся)
Разница есть. Рекурсия занимает гораздо больше памяти, в то время, как цикл не будет занимать ещё места, создавая свои копии.
Но проект то небольшой, как ты сам говорил) В моём случае рекурсия удобочитаемее. В большом проекте действительно лучше было бы использовать цикл.
 
Последнее редактирование:
Keine panik!
Эксперт
Статус
Оффлайн
Регистрация
29 Апр 2020
Сообщения
812
Реакции[?]
417
Поинты[?]
49K
как можно лучше реализовать
Боже, какой ублюдский код...
1) Зачем вообще использовать тут инициализацию через { }, если вызываешь конструктор по умолчанию - так и оставляй переменную, если присваиваешь ей 0 - так и пиши.
2) `result.clear(), text.clear(), count = 0, symbol = 0;` отличная экономия на строчках, дебажить такое ммм бон аппетит.
3) Зачем вообще нужна функция GetSymbolType() если она вызывается однажды, порождает ненужные константы 0,1,2 которые без енума хрен знает что означают, порождает ненужный вызов, генерацию таблицы для свитча, когда ее работу можно просто вклеить сразу в цикл и все будет на порядок понятнее и быстрее. Так же зачем передавать туда строку по значению, это вызывает ненужные копирования строки на каждом символе.
4) K&R отступы это просто ужасно, потому что этот стиль превращает код в кашу, при этом оставляешь пустые строки там где должна быть фигнурная скобка, чтобы вызвать батхерд даже у линуксоидов.
5) Зачем вообще нужен отдельный .h файл, когда всю логику можно легко уместить в одном .cpp.
6) Вызов main(); просто охерителен, оставить программу не выключая и активно пользуясь через тысячи попыток будет переполнение стека, потому что каждый вызов оставляет за собой минимум адрес возврата в стеке, так еще и все созданные на стеке строки продолжат висеть в нем, здесь нужен обычный цикл, причем не включающий setlocale и строки, потому что это глупость.
И мне уже надоело перечислять, в общем как критиковать мои сообщения, так ты мастер, а как написать хеллоуворлд, тут же обосрался, отвратительно.
 
Последнее редактирование:
Легенда форума
Статус
Оффлайн
Регистрация
10 Дек 2018
Сообщения
4,381
Реакции[?]
2,284
Поинты[?]
189K
Боже, какой ублюдский код...
Ку
1) Зачем вообще использовать тут инициализацию через { }, если вызываешь конструктор по умолчанию - так и оставляй переменную, если присваиваешь ей 0 - так и пиши.
1) Зачем писать, что я использую конструкцию { } без явного указания нуля, если, сука, конструкция { } сама по умолчанию присваивает переменной нулевое, для её типа данных, значение?
2) `result.clear(), text.clear(), count = 0, symbol = 0;` отличная экономия на строчках, дебажить такое ммм бон аппетит.
Согласен, отличная экономия. Можно ведь растянуть это на четыре строки, ведь слишком непонятно, что тут зануливаются вары программы. И как тут может произойти ошибка, ума не приложу. ДАЖЕ если там будет еррор и дебаг кинет на эту строчку, нельзя же будет разделить это, ведь делать это нам запрещает сам... а стоп блять, нам же никто не запрещает.
3) Зачем вообще нужна функция GetSymbolType() если она вызывается однажды
Для лучшей читабельности и понятности кода? Я сам прекрасно знаю, что можно полностью обойтись без этой функции, но мне так приятнее, ведь последующее использование свича намного красивее, нежели три конструкции if / else if / else.
порождает ненужные константы 0,1,2
Ну, я пытался сделать так, чтобы оно возвращало string'и, но сборщику эта идея жуть как не понравилась.
которые без енума хрен знает что означают
Ладно, тут действительно мой прокол, я забыл про enum.
порождает ненужный вызов, генерацию таблицы для свитча
Не вижу смысла жёстко оптимизировать такую маленькую программу, при том теряя красоту кода. Можно тогда было докопаться и до использования обычного int, вместо short вариации, это ведь целых несколько лишних байт!
когда ее работу можно просто вклеить сразу в цикл и все будет на порядок понятнее и быстрее.
Мне нужно ещё раз писать, что в маленьких проектах красота кода > оптимизация? (в разумных пределах, конечно & только на мой взгляд)
Так же зачем передавать туда строку по значению, это вызывает ненужные копирования строки на каждом символе.
Строку по значению? Что ты имеешь в виду?
4) K&R отступы это просто ужасно, потому что этот стиль превращает код в кашу, при этом оставляешь пустые строки там где должна быть фигнурная скобка, чтобы вызвать батхерд даже у линуксоидов.
Лол, не понимаю зачем доёбываться до кодстайла, когда это личное дело каждого.
Я вижу смысл использовать kr в маленьких по размеру конструкциях и функциях, чтобы фигурные скобки не загромождали код, лично мне так приятнее читать. Сам подумай, для чего в условной конструкции if, тело которой будет всего в две строчки, использовать дефолтный вид расположения { }?
Вообще-то мне и самому сложное читать чужой код, в котором используется такий кодстайл, но вот в своём коде мне так наоборот приятнее разбираться.
А пустое место там для того, чтобы код действительно не превратился в кашу, т.к. { в том бы месте дала практически пустую строку. Не понимаю чем тебе помешал пробел, ведь так код наоборот читается лучше (лично для меня, ну и это вполне логично, т.к. вместо фигурной скобки, которая в т.ч. может находиться практически по середине, там полностью пустая строка).
5) Зачем вообще нужен отдельный .h файл, когда всю логику можно легко уместить в одном .cpp.
Можно, но я не хочу загромождать верхнюю часть программы. Опять же, не понимаю зачем тут докоп. Программу можно расширять и улучшать, в этом случае .h и может пригодиться.
6) Вызов main(); просто охерителен, оставить программу не выключая и активно пользуясь через тысячи попыток будет переполнение стека, потому что каждый вызов оставляет за собой минимум адрес возврата в стеке, так еще и все созданные на стеке строки продолжат висеть в нем
Не думаю, что кто-то будет ей настолько активно пользоваться, но я даже проведу стресс-тест и посмотрю через сколько прокатов она вылетит, если вылетит вообще.
Опять же, я знаю, что такая рекурсия нежелательна, но, повторюсь, на мой взгляд, в небольших проектах, имеет смысл пожертвовать стабильностью / лучшими практиками в обмен на удобочитаемость.
И мне уже надоело перечислять, в общем как критиковать мои сообщения, так ты мастер, а как написать хеллоуворлд, тут же обосрался, отвратительно.
Очень странно, но, на моей памяти, я твои сообщения на форуме видел от силы пару раз, а чтобы я тебе отвечал - вообще не помню. Даже если воспользоваться поиском форума и ввести QUOTE="Debounce", от iDesync, то поиск ничего не покажет.
Наоборот, я тебе даже две положительных реакции поставил на твои сообщения с советами, связанных с программированием, одно из них было в моей теме с вопросом:
2021-09-09_145544.png

Даже при том, что ты в обоих случаях давал достаточно общие и очевидные советы.

А чтобы я твои сообщения на тему программирования критиковал - я такого вообще припомнить не могу, но если критиковал, значит было за что. И критикую я только объективно, а не тупо высираю какой-нибудь месседж вроде "код говно".
Алсо, ты так говоришь, как будто я каждый день пишу на плюсах и должен знать все ньюансы языка. Нет, это далеко не так. Программирую я, в лучшем случае, раз в три месяца, разве что не так давно я читал уроки на Ravesli (дочитал, вроде, до 9-10 главы).

Вместо того, чтобы объективно и без негатива дать советы, ты начинаешь притягивать за уши некоторые моменты и ведёшь себя как обиженный, хотя, опять же, я тебе вообще ни слова никогда не говорил.
 
Последнее редактирование:
Легенда форума
Статус
Оффлайн
Регистрация
10 Дек 2018
Сообщения
4,381
Реакции[?]
2,284
Поинты[?]
189K
Вызов main(); просто охерителен, оставить программу не выключая и активно пользуясь через тысячи попыток будет переполнение стека
Не, чел, её анриал крашнуть.
2021-09-09_180429.png
Кормил вронг инпутами, просто спамил беспрерывно, спамил огромными текстами, вообще пофиг.

2021-09-09_181029.png

Посему считаю твои обвинения не совсем корректными)


u.p.d вот, даже сейчас, скопировал текст на 8250 символов, вставил, программа даже начала несколько раз спамить частями из инпута и какими-то рандомными символами, я уж подумал, что всё. Но нет, после того, как она проспамила пару раз - всё опять нормально работает. Короче стабильности можно позавидовать.
u.p.d 2. программа вылетела после того, как я нажал ctrl a на форуме и беспрерывно вставлял содержимое в программу около 50 раз. Вопросы? хд
Мне кажется скорее сам буфер консоли на вывод переполнился, чем программа слетела
 
Последнее редактирование:
Олдфаг
Статус
Оффлайн
Регистрация
18 Фев 2019
Сообщения
2,826
Реакции[?]
1,853
Поинты[?]
24K
Мне нужно ещё раз писать, что в маленьких проектах красота кода > оптимизация? (в разумных пределах, конечно & только на мой взгляд)
Оптимизация кода всегда важнее. Конечный пользователь вряд ли реверсить Ваш проект.
Да и вообще, заявления Debounce полностью корректны, закрыть глаза можно только на претензии насчёт кодстайла. Не нужно отвергать здравую критику, если нет понимания ее объективности ;)
 
Легенда форума
Статус
Оффлайн
Регистрация
10 Дек 2018
Сообщения
4,381
Реакции[?]
2,284
Поинты[?]
189K
Да и вообще, заявления @@Debounce полностью корректны, закрыть глаза можно только на претензии насчёт кодстайла. Не нужно отвергать здравую критику, если нет понимания ее объективности ;)
Я не отвергаю здравую критику, если вижу её.
Все свои мысли я изложил в ответе на его пост. По-моему, там есть немало аргументов.
Оптимизация кода всегда важнее. Конечный пользователь вряд ли реверсить Ваш проект.
Это твоё мнение, у меня оно другое)
Одно дело, когда в больших проектах есть такие приколы, а другое - когда в маленьком и опенсорсном.

Энивей - даже на эту тему не вижу смысла спорить, ибо я стресстестил программу и она крашнула только после 50-го раза беспрерывного ввода текста на 20693 символа, который, также, содержал много вронг инпута. И то мне кажется, что крашнула консоль из-за переполнения буфера, а сама не программа.
Хотя бы на основании этого я могу считать, что использование не лучших практик кодинга в угоду красоты кода - не всегда плохо.
 
Последнее редактирование:
Keine panik!
Эксперт
Статус
Оффлайн
Регистрация
29 Апр 2020
Сообщения
812
Реакции[?]
417
Поинты[?]
49K
ибо я стресстестил программу
Хорошо, докажу математически.
В твоей функции main() минимум две std::string, если мы берем 32-битную версию, то там 16 байт на SSO (внутренний буффер) + 2 size_t по 4 байта, итого 24 * 2 = 48 байт в стеке лежит пока функцияя выполняется. Затем при вызове main() в стек кладется адрес возврата, это еще 4 байта, плюс пролог который сохраняет регистры и другие переменные, округлим до 64 байт для удобства. Таким образом каждый фрейм main() стоит 64 байта, каждую новую итерацию добавляется это количество, все объекты продолжают висеть вместо того чтобы переиспользоваться, создается огромная цепочка деструкции. Если мы берем для примера 1мб стека, то через 16384 итерации программа забьет весь стек и вылетит с исключением. Я не знаю что именно ты тестил, но тут важно не размер текста (хотя вся выделенная память так же продолжает висеть), а количество попыток.
И здесь неважно расширишь ты стек, или тебе поможет компилятор соптимизировать хвостовую рекурсию, важно то что это ансейф, которого не должно быть.

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

ты в обоих случаях давал достаточно общие и очевидные советы.
Какие вопросы - такие ответы. Спроси меня что-то сложнее, и я отвечу сложнее.
Моя специфика протекторы, теория компиляторов, криптография, рендеринг, сетевые технологии, оптимизации кода.

будто я каждый день пишу на плюсах и должен знать все ньюансы языка
Еще как должен, C++ это строгий язык который требует от тебя глубоких познаний, чтобы писать стабильный, сложный и быстрый софт, для остальных случаев есть скриптовые языки для домохозяек.

Строку по значению? Что ты имеешь в виду?
Да, std::string это объект, у которого нетривиальная конструкция и деструкция, в функции GetSymbolType() ты передаешь ее без ссылки, т.е. будет создаваться ее копия, причем компилятор не сможет использовать конструктор перемещения, т.к. есть доп зависимости на переменную внизу, в результате ты передаешь в функцию копию которая создается лишь на вызов и ее можно изменять, хотя тебе нужно лишь прочитать оттуда символы, поэтому нужно писать const string& text, тогда в машинном языке туда передастся лишь указатель и это будет стоить ничего раз уж ты решил писать отдельную функцию.
 
Последнее редактирование:
Эксперт
Статус
Оффлайн
Регистрация
17 Фев 2017
Сообщения
864
Реакции[?]
420
Поинты[?]
1K
Хорошо, докажу математически.
В твоей функции main() минимум две std::string, если мы берем 32-битную версию, то там 16 байт на SSO (внутренний буффер) + 2 size_t по 4 байта, итого 24 * 2 = 48 байт в стеке лежит пока функцияя выполняется. Затем при вызове main() в стек кладется адрес возврата, это еще 4 байта, плюс пролог который сохраняет регистры и другие переменные, округлим до 64 байт для удобства. Таким образом каждый фрейм main() стоит 64 байта, каждую новую итерацию добавляется это количество, все объекты продолжают висеть вместо того чтобы переиспользоваться, создается огромная цепочка деструкции. Если мы берем для примера 1мб стека, то через 16384 итерации программа забьет весь стек и вылетит с исключением. Я не знаю что именно ты тестил, но тут важно не размер текста (хотя вся выделенная память так же продолжает висеть), а количество попыток.
И здесь неважно расширишь ты стек, или тебе поможет компилятор соптимизировать хвостовую рекурсию, важно то что это ансейф, которого не должно быть.


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


Какие вопросы - такие ответы. Спроси меня что-то сложнее, и я отвечу сложнее.
Моя специфика протекторы, теория компиляторов, криптография, рендеринг, сетевые технологии, оптимизации кода.


Еще как должен, C++ это строгий язык который требует от тебя глубоких познаний, чтобы писать стабильный, сложный и быстрый софт, для остальных случаев есть скриптовые языки для домохозяек.
За скриптовые языки для домохозяек обидно, вообще-то)
То что у С++ порог входа гораздо выше, чем у остальных, согласен. Это глупо отрицать. Ну у плюсов нет Garbage Collector с коробки, поэтому чистка или переиспользование памяти это обязательно. Лучше бы вместо всего этого, сказали бы ему написать простой тест прогон на хотя бы 1000000 итераций с полностью забитой строкой. Когда оно выест всю память, тогда станет нагляднее) а то математически, теоретически и тд - мало понятно)
Я не отвергаю здравую критику, если вижу её.
Все свои мысли я изложил в ответе на его пост. По-моему, там есть немало аргументов.

Это твоё мнение, у меня оно другое)
Одно дело, когда в больших проектах есть такие приколы, а другое - когда в маленьком и опенсорсном.

Энивей - даже на эту тему не вижу смысла спорить, ибо я стресстестил программу и она крашнула только после 50-го раза беспрерывного ввода текста на 20693 символа, который, также, содержал много вронг инпута. И то мне кажется, что крашнула консоль из-за переполнения буфера, а сама не программа.
Хотя бы на основании этого я могу считать, что использование не лучших практик кодинга в угоду красоты кода - не всегда плохо.
Без обид, но в Опен сорсе такой код сразу бы зареджектили и за оверинжиниринг и за утечки памяти.
В конторах без код ревью мб такое прокатило до поры до времени.

Не надо воспринимать критику в штыки, если делается для себя. Если желание учиться что б стать разработчиком и вести проф деятельность, то такие вещи следует учитывать и исправляться)
 
Легенда форума
Статус
Оффлайн
Регистрация
10 Дек 2018
Сообщения
4,381
Реакции[?]
2,284
Поинты[?]
189K
Не надо воспринимать критику в штыки, если делается для себя. Если желание учиться что б стать разработчиком и вести проф деятельность, то такие вещи следует учитывать и исправляться)
Вот именно, что у меня нет такого желания. Если я по рофлу решил написать какую-то полезную (для кого-то) программу, это не означает, что я должен знать все ньюансы языка, как выразился мистер Debounce.

Энивей, я уже сказал, что я знаю про большинство описанных недостатков, я сделал их специально.
Продолжать этот монолог смысла не имеет.
Я всё. Можете не отвечать на этот месседж.

p.s. ну и принимать реакции как личное оскорбление / критику - умное решение, тут ничего не могу сказать.
 
Последнее редактирование:
Пользователь
Статус
Оффлайн
Регистрация
23 Окт 2020
Сообщения
98
Реакции[?]
46
Поинты[?]
0
Мне кажется в первую очередь нужно проверить систему на поддержку языка в данном случае русского языка.
Я не особо понимаю но типо этого.
C++:
#include <iostream>
#include <io.h>
#include <fcntl.h>
using namespace std;
int main() {
    if (setlocale(LC_ALL, "Russ") == NULL) {
        cout << "Error set locale ru-RU." << endl;
    } else {
        cout << "Good -> Хорошо" << endl;
    }
    if (setlocale(LC_ALL, "Eng") == NULL) {
        cout << "Error set locale Eng." << endl;
    } else {
        cout << "Good -> English" << endl;
    }
    wcout << "Здарова" << endl;
    _setmode(_fileno(stdout), _O_U16TEXT);
    wcout << L"Здарова";
    return 0;
}
Capture.PNG
 
Легенда форума
Статус
Оффлайн
Регистрация
10 Дек 2018
Сообщения
4,381
Реакции[?]
2,284
Поинты[?]
189K
Мне кажется в первую очередь нужно проверить систему на поддержку языка в данном случае русского языка.
Я не особо понимаю но типо этого.
C++:
#include <iostream>
#include <io.h>
#include <fcntl.h>
using namespace std;
int main() {
    if (setlocale(LC_ALL, "Russ") == NULL) {
        cout << "Error set locale ru-RU." << endl;
    } else {
        cout << "Good -> Хорошо" << endl;
    }
    if (setlocale(LC_ALL, "Eng") == NULL) {
        cout << "Error set locale Eng." << endl;
    } else {
        cout << "Good -> English" << endl;
    }
    wcout << "Здарова" << endl;
    _setmode(_fileno(stdout), _O_U16TEXT);
    wcout << L"Здарова";
    return 0;
}
Посмотреть вложение 173982
В этом нет необходимости, т.к. эта программа будет полезна только русскоговорящим людям.
 
Сверху Снизу