На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Правила раздела:
1. Название темы - краткое описание кто/что против кого/чего
2. В первом сообщении - список параметров, по которым идет сравнение.
3. Старайтесь аргументировать свои высказывания. Фразы типа "Венда/Слюникс - ацтой" считаются флудом.
4. Давайте жить дружно и не доводить обсуждение до маразма и личных оскорблений.
Модераторы: Модераторы, Комодераторы
  
> Бага в плюсах ?
    Всем привет.

    Вот есть пример использования std::quoted: https://en.cppreference.com/w/cpp/io/manip/quoted
    ExpandedWrap disabled
      #include <iostream>
      #include <iomanip>
      #include <sstream>
       
      void default_delimiter() {
        const std::string in = "std::quoted() quotes this string and embedded \"quotes\" too";
        std::stringstream ss;
        ss << std::quoted(in);
        std::string out;
        ss >> std::quoted(out);
       
        std::cout << "Default delimiter case:\n"
                     "read in     [" << in << "]\n"
                     "stored as   [" << ss.str() << "]\n"
                     "written out [" << out << "]\n\n";
      }
       
      void custom_delimiter() {
        const char delim {'$'};
        const char escape {'%'};
       
        const std::string in = "std::quoted() quotes this string and embedded $quotes$ $too";
        std::stringstream ss;
        ss << std::quoted(in, delim, escape);
        std::string out;
        ss >> std::quoted(out, delim, escape);
       
        std::cout << "Custom delimiter case:\n"
                     "read in     [" << in << "]\n"
                     "stored as   [" << ss.str() << "]\n"
                     "written out [" << out << "]\n\n";
      }
       
      int main() {
        default_delimiter();
        custom_delimiter();
      }


    ExpandedWrap disabled
      Default delimiter case:
      read in     [std::quoted() quotes this string and embedded "quotes" too]
      stored as   ["std::quoted() quotes this string and embedded \"quotes\" too"]
      written out [std::quoted() quotes this string and embedded "quotes" too]
       
      Custom delimiter case:
      read in     [std::quoted() quotes this string and embedded $quotes$ $too]
      stored as   [$std::quoted() quotes this string and embedded %$quotes%$ %$too$]
      written out [std::quoted() quotes this string and embedded $quotes$ $too]

    Внимание смотрим на stored as - ну че за говно? Откуда там взялось "" начальные?
      Странно, где вы тут баг увидели? Входная строка (read in) в точности соответствует выходной строке (written out).

      А в stored as он сохранил все правильно (с экранированием).

      Если в строке встречается escape или delim тогда к ним подставляется еще один escape при << и удаляется при >>.

      ExpandedWrap disabled
        #include <iostream>
        #include <iomanip>
        #include <sstream>
         
        void default_delimiter() {
          const std::string in = "std::quoted() quotes \\% this string and embedded \"quotes\" too";
          std::stringstream ss;
          ss << std::quoted(in);
          std::string out;
          ss >> std::quoted(out);
         
          std::cout << "Default delimiter case:\n"
                       "read in     [" << in << "]\n"
                       "stored as   [" << ss.str() << "]\n"
                       "written out [" << out << "]\n\n";
        }
         
        void custom_delimiter() {
          const char delim {'$'};
          const char escape {'%'};
         
          const std::string in = "std::quoted() quotes \\% this string and embedded $quotes$ $too";
          std::stringstream ss;
          ss << std::quoted(in, delim, escape);
          std::string out;
          ss >> std::quoted(out, delim, escape);
         
          std::cout << "Custom delimiter case:\n"
                       "read in     [" << in << "]\n"
                       "stored as   [" << ss.str() << "]\n"
                       "written out [" << out << "]\n\n";
        }
         
        int main() {
          default_delimiter();
          custom_delimiter();
        }


      Скрытый текст
      Обратите внимание на escape символы после слова quotes
      ExpandedWrap disabled
        Default delimiter case:
        read in     [std::quoted() quotes \% this string and embedded "quotes" too]
        stored as   ["std::quoted() quotes \\% this string and embedded \"quotes\" too"]
        written out [std::quoted() quotes \% this string and embedded "quotes" too]
         
        Custom delimiter case:
        read in     [std::quoted() quotes \% this string and embedded $quotes$ $too]
        stored as   [$std::quoted() quotes \%% this string and embedded %$quotes%$ %$too$]
        written out [std::quoted() quotes \% this string and embedded $quotes$ $too]
      Сообщение отредактировано: macomics -
        Цитата macomics @
        А в stored as он сохранил все правильно (с экранированием).

        Мне надо строку заэкранировать и послать в JSON, начал гуглить что есть в плюсах, нашел эту функцию std::quoted, вроде она делает то, что надо, но добавляет в начало и конец строки - кавычки. Теперь от них избавляться надо по тупому. Причем она их добавляет, но не экранирует. Спрашивается нафига вообще эта функция нужна? Какой в ней смысл? Она экранирует кавычки и добавляет неэкранированные ковычки. Лол.

        Добавлено
        Цитата macomics @
        Входная строка (read in) в точности соответствует выходной строке (written out).

        А в чем смысл этой функции вообще? Строку в кавычки обернуть? Вечно в плюсах все через жопу. Лучше бы сделали отдельно, функцию - которая оборачивает строку кавычками. А не пихали все в кучу.
        Сообщение отредактировано: Wound -
          Цитата Wound @
          А в чем смысл этой функции вообще?

          Там в самом начале написано, что функция действует в соответствии с форматами XML или CSV, а не JSON.
            Цитата Wound @
            А в чем смысл этой функции вообще?

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

            Добавлено
            Цитата macomics @
            Там в самом начале написано, что функция действует в соответствии с форматами XML или CSV, а не JSON.

            Думаю, когда это писали, JSON просто не был популярен
              Цитата macomics @
              Там в самом начале написано, что функция действует в соответствии с форматами XML или CSV, а не JSON.

              А кому это нужно? Вместо чего то юзабельного - нарисовать какую то шнягу, которую вообще никто и никогда в жизни не будет юзать.

              Добавлено
              Цитата kopilov @
              Думаю, когда это писали, JSON просто не был популярен

              Кого этописали? Эту функцию? std::quoted ? Она появилась судя по доке в С++14, в те времена XML отмер уже окончательно, передав бразды правления JSON'у
              Сообщение отредактировано: Wound -
                Цитата kopilov @
                Думаю, когда это писали, JSON просто не был популярен

                Прикреплённая картинка
                Прикреплённая картинка


                Цитата Wound @
                Вместо чего то юзабельного - нарисовать какую то шнягу, которую вообще никто и никогда в жизни не будет юзать.

                Ну вы, например, CSV не используете. А вот мне приходится ещё им пользоваться.
                Сообщение отредактировано: macomics -
                  Цитата kopilov @
                  Получается, она из текста делает корректный литерал, который будет содержать этот текст.
                  Если в выводе где-то есть добавление кавычек по краям без экранирования внутренних — надо убрать, функция как раз всё и делает за тебя

                  Чего она делает? Функция экранирует строку, типа написал ты A\", она тебе вернет "A\\\"", сама строка вот так будет выглядеть. Понимаешь? В ней появляются лишние неэкранированные кавычки, первая перед А, вторая после " . Так что я вообще не понимаю зачем эта функция нужна. Я на нее набрел случайно, когда искал как экранировать строку в плюсах.
                    Цитата Wound @
                    В ней появляются лишние неэкранированные кавычки, первая перед А, вторая после "

                    Для CSV это как раз очень удобно.
                      Цитата Wound @
                      Так что я вообще не понимаю зачем эта функция нужна

                      Как пример, для кодогенерации.
                      stc::cout << "A\\\"" ; // выведет A\"
                      Ну и с записью в прочие (кроме исходного кода) человеко-машино-читаемые форматы то же самое
                        Цитата macomics @
                        Для CSV это как раз очень удобно.

                        Есть много чего удобно, чего нет в плюсах. Зачем тогда эту функцию вводить стандарт - если она пилится для CSV и XML ?
                        В плюсах - кавычки к строке добавить или обернуть строку в кавычки - это очень плевое дело, да хоть тем же форматом. А вот удалить из строки кавычки - без пол литра не разобраться. Зачем пилить говно функцию - которая нужна для каких то xml и тащить ее в плюсы? Как по мне обычное экранирование строк на порядки порядков чаще встречается, чем вот это все. Плюс если мне надо будет работать с XML, или CSV - я лучше возьму готовые библиотеки, чем буду извращаться на голых плюсах писать что то. Короче подход как всегда. Понавводить всякой шняги, при этом не нужной.

                        Добавлено
                        Цитата kopilov @
                        Как пример, для кодогенерации.
                        stc::cout << "A\\\"" ; // выведет A\"

                        Для какой кодогенерации ? чем "\"A\\\"\"" отличается от "A\\\"" ? Ты разницу не видишь?
                        Сообщение отредактировано: Wound -
                          Цитата Wound @
                          люс если мне надо будет работать ... или CSV
                          Зачем вам для чтения текстового файла какие-то специальные библиотеки?
                            Цитата macomics @
                            Зачем вам для чтения текстового файла какие-то специальные библиотеки?

                            А попробуйте ка, без каких-то специальных библиотек, распарсить XML файл на элементы и атрибуты? Желательно не портянкой вырвиглазной и багнутой, а парой тройкой строк кода ?
                            Если вы не в силах это вопроизвести тут и сейчас, то вам стоило бы промолчать и пройти мимо, а не писать то что вы пишете.
                            Или вы когда писали свой бред, то акцент делали на слово "для чтения" ? Если так, то я про "чтение" ничего не писал. Я писал про работу с конкретными форматами(кстати какое отношение вышеперечисленные форматы имеют к плюсам) ? Может еще какой нибудь Exel формат добавить в плюсы?
                            Сообщение отредактировано: Wound -
                              Цитата Wound @
                              Для какой кодогенерации ? чем "\"A\\\"\"" отличается от "A\\\"" ? Ты разницу не видишь?

                              Разницу вижу. Не вижу, откуда взялся "\"A\\\"\""

                              ОК, держи полный пример.

                              ExpandedWrap disabled
                                #include <iostream>
                                #include <iomanip>
                                int main(int argc, char** argv) {
                                    std::cout << "#include <iostream>" << std::endl;
                                    std::cout << "int main(int argc, char** argv) {" << std::endl;
                                    std::cout << "    //We should print " << argv[1] << std::endl;
                                    std::cout << "    //equivalent literal is " << std::quoted(argv[1]) << std::endl;
                                    std::cout << "    std::cout << " << std::quoted(argv[1]) << " << std::endl;" << std::endl;
                                    std::cout << "}" << std::endl;
                                }


                              Сохраним, как generator.cpp, скомпилируем один раз.
                              Сгенерируем несколько шаблонных кодов. (Я запускаю в Linux, поэтому тоже с экранированием, но апострофами, для простоты. Для сравнения, можно с этими же параметрами запустить echo)
                              ExpandedWrap disabled
                                :~$ g++ -o generator generator.cpp
                                :~$ ./generator '\' > generated1.cpp
                                :~$ ./generator '"' > generated2.cpp
                                :~$ ./generator 'A\"' > generated3.cpp


                              Читаем получившиеся файлы (для понимания). И запускаем.
                              ExpandedWrap disabled
                                :~$ g++ -o generated1 generated1.cpp
                                :~$ g++ -o generated2 generated2.cpp
                                :~$ g++ -o generated3 generated3.cpp
                                :~$ ./generated1
                                \
                                :~$ echo '\'
                                \
                                :~$ ./generated2
                                "
                                :~$ echo '"'
                                "
                                :~$ ./generated3
                                A\"
                                :~$ echo 'A\"'
                                A\"


                              Видим, что каждый сгенерированный исходник сохранил в человеко-машино-читаемом виде то, что было непосредственно задано при генерации
                                Цитата Wound @
                                А попробуйте ка, без каких-то специальных библиотек, распарсить XML файл на элементы и атрибуты?

                                Вы не заметили, что я убрал XML. Я работаю с CSV и это очень удобно без каких-либо дополнительных библиотек.

                                Цитата kopilov @
                                (Я запускаю в Linux, поэтому тоже с экранированием, но апострофами, для простоты. Для сравнения, можно с этими же параметрами запустить echo)

                                Linux, кстати, тоже использует эту самую std::quoted для работы с командной строкой. Это тоже удобно для запуска внешних программ использовать.
                                Сообщение отредактировано: macomics -
                                  Очевидно же, что функция предназначена для работы со строками в форматах, где строки окавычиваются, а кавычки в качестве обычных элементов, а не ограничителей строки, обрабатываются, также, как и в Плюсах. Ровно это она и делает. Без этого формировать или парсить такие значения на Плюсах неудобно, придётся самому корёжить строку со встроенными " при выводе и парсить при чтении. Причём регулярками это хрен так легко сделаешь, т.к. нужно учитывать \ перед ", которые будут не ", и ещё \ перед \, которые не будут \, так что даже банальным циклом не так просто заморочиться. Если б дело было просто в расстановке/удалении кавычек по краям, вопроса б не было.
                                    Цитата macomics @
                                    Вы не заметили, что я убрал XML.

                                    Заметил вообще то, но ты упор сделал на чтении текстовых файлов, а не на CSV, XML - вполне себе текстовый файл.

                                    Цитата kopilov @
                                    Не вижу, откуда взялся "\"A\\\"\""

                                    Так функция же добавила.

                                    Добавлено
                                    Цитата Qraizer @
                                    Очевидно же, что функция предназначена для работы со строками в форматах, где строки окавычиваются, а кавычки в качестве обычных элементов, а не ограничителей строки, обрабатываются, также, как и в Плюсах. Ровно это она и делает. Без этого формировать или парсить такие значения на Плюсах неудобно, придётся самому корёжить строку со встроенными " при выводе и парсить при чтении.

                                    Я уже понял что она делает. Она какую то узконаправленную задачу решает, которая нужна макомиксу для чтения CSV файлов, и похоже что все. А еще кто то ее в линуксах юзает. Зато про экранировать строку - разрабы стандарта похоже не слышали. Зачем делать такую сложную функцию? Не проще ли сделать 2 - одна для экранирования, вторая для того чтоб кавычить?
                                    Сообщение отредактировано: Wound -
                                      P.S. У меня вот шелезяка выдаёт в RS-232 строку приглашения с версией, которую надо парсить, чтоб убедиться, что шелезяка работает. Причём ещё шелезяки разных ревизий отличаются этими строками. Сделал .ini, в котором расписал все возможные строки и соответствующие им версии. И всё бы ничего, если б в этих строках не могли встречаться спец.символы, те же \n или \t, например. Так что пришлось руками хреначить целую единицу трансляции, чтоб забрать строки из .ini в формате строковых литералов Плюсов и представить их в качестве корректного символьного массива. На вскидку: \n, \r, \a, \b, \f, \t, \v, \', \", \?, \\ – лепота; \xHH, \OOO – м-м-м как интересно; а самый смак \uXXXX, \UXXXXXXXX. Вот от какого манипулятора я бы не отказался. Особенно от двух последних, ибо кастить юникоды через локали то ещё удовольствие

                                      Добавлено
                                      Цитата Wound @
                                      Не проще ли сделать 2 - одна для экранирования, вторая для того чтоб кавычить?
                                      Не проще. Что делать со строкой
                                      ExpandedWrap disabled
                                        Бегемот сказал "бла-бла-бла" и выпрыгнул на ходу, а водитель подумал "идиот"
                                      при окавычивании, ещё понятно, а что делать с
                                      ExpandedWrap disabled
                                        "Бегемот сказал "бла-бла-бла" и выпрыгнул на ходу, а водитель подумал \"идиот\"
                                      при чтении, вообще не понятно. Примерно так же поступили с operator new и operator delete в своё время. Они сразу делают две вещи: и управляют памятью, и создают/разрушают объекты конструкторами/деструкторами. Несмотря на то, что управление памятью и создание/уничтожение объектов – это две совершенно разные задачи, выполняются они всегда вместе, во избежание.

                                      Добавлено
                                      P.S. Кавычки в примерах расставлены именно так, как я хотел.

                                      Добавлено
                                      Ты, Wound, наверное, никогда не сталкивался с необходимостью квалифицировать свои инструменты на отказоустойчивость и достигать 100% структурного покрытия блоков, операторов, решений и условий для этого. Работать в идеальном или хотя бы в адекватно себя ведущем исполнительном окружении всегда хочется, но нельзя, приходится предусматривать возможность мульёна разных багов со стороны, которую ты не контролируешь. Так что тебе на вход может прилететь невесть что и как оформленное, и вон те примеры, наполовину такие, а на другую половину недосякие, вполне будут реальны, если не решать обе задачи std::quoted одновременно. А оно надо кому?
                                      Сообщение отредактировано: Qraizer -
                                        Цитата Qraizer @
                                        Не проще.

                                        Очень странно. Функция ведет себя как то иначе при разных условиях или что?

                                        Цитата Qraizer @
                                        при окавычивании, ещё понятно, а что делать с

                                        Ровно то же, что делает эта функция - экранировать и окавычить. Не понимаю смысла вопросов.

                                        Я тебе пишу - берем эту функцию и делим на 2 функции. Ты спрашиваешь - и что делать вот с такой строкой. Ну как что? Если раньше ты вызывал 1 функцию, то теперь одну передашь в другую делов то.

                                        А вот встречный вопрос, что делать если мне надо просто экранировать символы в строке? Вот что мне делать? Писать свой велосипед? Т.е. какую то шнягу они в стандарт затащили, а то что вылезает везде где пользователь что то вводит, пароль например со спец символами - они сделать не додумались. Ну супер.
                                          Цитата Wound @
                                          Я тебе пишу - берем эту функцию и делим на 2 функции. Ты спрашиваешь - и что делать вот с такой строкой. Ну как что? Если раньше ты вызывал 1 функцию, то теперь одну передашь в другую делов то.
                                          Хм. А вот вызвал я окавычивание, а экранирование не стал. особенно. Если там изначально баг с расстановкой кавычек. На, разгребай при чтении:
                                          ExpandedWrap disabled
                                            "Бегемот сказал "бла-бла-бла" и выпрыгнул на ходу, а водитель подумал «идиот"
                                          Добавь туда для гарантии EOLолов или наоборот убери, если они там есть:
                                          ExpandedWrap disabled
                                            <pr>"Бегемот сказал "бла-бла-бла" и выпры
                                            гнул на ходу, а водитель подумал «идиот"</pr>


                                          Добавлено
                                          Не забывай, ты разговариваешь, с профессиональным :blush: верификатором

                                          Добавлено
                                          Цитата Wound @
                                          А вот встречный вопрос, что делать если мне надо просто экранировать символы в строке? Вот что мне делать? Писать свой велосипед?
                                          На все случаи жизни библиотек не напасёшься. Зато есть универсальные, которые позволяют тебе нахреначить любую грамматику, какую захочешь. Придумывай формат или бери имеющийся готовый, описывай её в каком-нибудь boost::spirit, и радуйся на здоровье.

                                          Так-то я не спорю, что фича малость сахарная. С другой стороны тогда это был бы не легковесный IO-манипулятор, тогда как просили как раз о нём.
                                          Сообщение отредактировано: Qraizer -
                                            Цитата Qraizer @
                                            Хм. А вот вызвал я окавычивание, а экранирование не стал. особенно. Если там изначально баг с расстановкой кавычек.

                                            Это вопросы из серии если бы, да кабы. Вон тебя не смущает всякие функции std::remove_if ? Иди удали элемент. Да фиг там, сидишь и думаешь - а че случилось, вроде хотел удалить, а ничего не произошло. А тут еще какой то std::erase Надо вызвать. Вот жеж. И никого это не смущает, еще и за фичу выдавать будете. Че не сделать нормальный remove_if, который именно что удаляет, а не занимается фигней?
                                            Вот так и тут. Забыл экранирование вызвать? Ну значит оно тебе и не нужно было. Попробуй невалидный итератор передать в функцию remove_if - будет тоже самое что и в твоем случае. А вообще даже если у тебя там баг с расстановкой кавычек, эта функция тебе еще две добавит и все. Она судя по всему именно так и работает.


                                            Цитата Qraizer @
                                            Добавь туда для гарантии EOLолов или наоборот убери, если они там есть

                                            Я вообще не понимаю сути вопроса. Да понапихай туда всего чего надо и не надо, еще и бинарных нечитаемых символов напихай. И чего? Функция все что делает - это экранирует уже существующие кавычки и другие знаки + всегда, хоть у тебя там в начале уже 100 кавычек - она добавит еще по одной ковычке - спереди и сзади. Какой в этом толк то? Вы мне рассказываете вам в линуксе с этим удобно или CSV парсить? Лол. Так в чем вопрос - смотрите еще раз: Берем эту функцию, делим ее на две, одна экранирует, вторая окавычивает. И все. В итоге теперь это все можно использовать еще и для экранирования !!!
                                            Но нет же. Надо обязательно создать какую то узконаправленную функцию, которая нужна трем с половиной челам, и то в теории. На практике они скорее ее не юзали эту функцию никогда в жизни, и скорее всего узнали о ней либо только сейчас, либо где то как то краем уха слышали.


                                            Цитата Qraizer @
                                            На все случаи жизни библиотек не напасёшься. Зато есть универсальные, которые позволяют тебе нахреначить любую грамматику, какую захочешь. Придумывай формат или бери имеющийся готовый, описывай её в каком-нибудь boost::spirit, и радуйся на здоровье.

                                            Зачем мне Boost ? У меня резко нарисовался баг в мелкой тулзе, в пароль передали спецсимволы типа кавычки, и сервак не распарсил это. Нужно было просто экранировать строку.


                                            И никто из вас так и не написал, как же мне экранировать строку? В общем то я уже сделал задачу, просто интересно от местных услышать. А то всякие байки о том, какая эта функция важная из за того что помимо того что экранирует еще и кавычит, рассказываете.
                                            Сообщение отредактировано: Wound -
                                              Цитата Wound @
                                              И никто из вас так и не написал, как же мне экранировать строку?

                                              Перечитайте свой первый пост. Вы там ни о чем таком не просили. Писали, что баг нашли...

                                              Скрытый текст
                                              Если надо избавиться от кавычек, тогда что мешает сделать так
                                              ExpandedWrap disabled
                                                #include <iostream>
                                                #include <iomanip>
                                                #include <sstream>
                                                 
                                                void default_delimiter() {
                                                  const std::string in = "std::quoted() quotes this string and embedded \"quotes\" too";
                                                  std::stringstream ss;
                                                  ss << std::quoted(in);
                                                  std::string out;
                                                  ss >> std::quoted(out);
                                                 
                                                  std::cout << "Default delimiter case:\n"
                                                               "read in     [" << in << "]\n"
                                                               "stored as   [" << ss.str().substr(1,ss.str().size() - 2) << "]\n"
                                                               "written out [" << out << "]\n\n";
                                                }
                                                 
                                                void custom_delimiter() {
                                                  const char delim {'$'};
                                                  const char escape {'%'};
                                                 
                                                  const std::string in = "std::quoted() quotes this string and embedded $quotes$ $too";
                                                  std::stringstream ss;
                                                  ss << std::quoted(in, delim, escape);
                                                  std::string out;
                                                  ss >> std::quoted(out, delim, escape);
                                                 
                                                  std::cout << "Custom delimiter case:\n"
                                                               "read in     [" << in << "]\n"
                                                               "stored as   [" << ss.str().substr(1,ss.str().size()-2) << "]\n"
                                                               "written out [" << out << "]\n\n";
                                                }
                                                 
                                                int main() {
                                                  default_delimiter();
                                                  custom_delimiter();
                                                }
                                              ExpandedWrap disabled
                                                Default delimiter case:
                                                read in     [std::quoted() quotes this string and embedded "quotes" too]
                                                stored as   [std::quoted() quotes this string and embedded \"quotes\" too]
                                                written out [std::quoted() quotes this string and embedded "quotes" too]
                                                 
                                                Custom delimiter case:
                                                read in     [std::quoted() quotes this string and embedded $quotes$ $too]
                                                stored as   [std::quoted() quotes this string and embedded %$quotes%$ %$too]
                                                written out [std::quoted() quotes this string and embedded $quotes$ $too]
                                              Сообщение отредактировано: macomics -
                                                Цитата Wound @
                                                Че не сделать нормальный remove_if, который именно что удаляет, а не занимается фигней?
                                                Потому что алгоритм ничего не знает о контейнерах, итераторы которого ему переданы в обработку. К тому же не факт, что я захочу их удалить из контейнера, а не, скажем, передать в очередной алгоритм. Другое дело, если б он назывался erase_if(), но ведь он remove_if(), а значит не уничтожает, а убирает за пределы диапазона, определяемого итераторами.
                                                Впрочем, тут это оффтоп. Так-то всё достаточно подробно объяснено в соответствующей литературе.
                                                Цитата Wound @
                                                Но нет же. Надо обязательно создать какую то узконаправленную функцию, которая нужна трем с половиной челам, и то в теории.
                                                Ну вот с чего ты взял, что всё не с точностью до наоборот, и это ты входишь в число 3,5 человек, а? Просили сделать простой манипулятор, чтобы строки можно было просто форматировать под протоколы, которые требуют заключать их в кавычки. Если б дело было в простых
                                                ExpandedWrap disabled
                                                  auto toOutput = [](const std::string& str){ return '"' + myString + '"'; };
                                                  auto fromInput= [](const std::string& str){ return str.substr(str.start_with('"'), str.length() - str.end_with('"') - str.start_with('"')); };
                                                то вопрос вообще бы не стоял. Но ведь надо ж ещё поискать " внутри, чтобы они не воспринимались как ограничители. Но это только в том случае, если перед " нет \, тогда это уже не ограничитель. Но только в том случае, если перед \ нет ещё одного \, тогда это всё-таки ограничитель. И про триграф ??/ ещё не забыть.
                                                Цитата Wound @
                                                У меня резко нарисовался баг в мелкой тулзе, в пароль передали спецсимволы типа кавычки, и сервак не распарсил это. Нужно было просто экранировать строку.


                                                И никто из вас так и не написал, как же мне экранировать строку?
                                                Ябеспонятия, что тебе было надо. И даже сейчас тоже беспонятия, что ты понимаешь под понятием экранирования. Что там надо твоему серверу, мне неведомо. Возможно у вас плохой сервер, выкинете его на свалку и возьмите хороший.
                                                Как по мне, мне нужен манипулятор, который полностью хендлит любые ESC, как вон я выше описывал.
                                                Сообщение отредактировано: Qraizer -
                                                  Цитата macomics @
                                                  Вы там ни о чем таком не просили.

                                                  Там не писал, а дальше написал. И да, цель не в том чтобы написать это в принципе, потому что я не умею. Я и сам могу написать, цель в том, что б сделать это лаконично и по феншуюю. Другими словами - если что то подобное для этого уже есть в STL, а ты напишешь свой велосипед - то это уже будет не круто, конечно если ты не обоснуешь что твой велосипед круче, чем то, что уже например есть.

                                                  Добавлено
                                                  Цитата Qraizer @
                                                  Другое дело, если б он назывался erase_if(), но ведь он remove_if(), а значит не уничтожает, а убирает за пределы диапазона, определяемого итераторами.

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

                                                  Цитата Qraizer @
                                                  Ну вот с чего ты взял, что всё не с точностью до наоборот, и это ты входишь в число 3,5 человек, а?

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

                                                  Цитата Qraizer @
                                                  Как по мне, мне нужен манипулятор, который полностью хендлит любые ESC, как вон я выше описывал.

                                                  Я ж выше написал. Ты давно регился на ресурсах? Там в паролях предлагается юзать спецсимволы - ",/,|,\,! ну типа этих. Очевидно что некоторые из них, если их не экранировать - будут создавать ошибки. В командной строке, передаче по сети в различных текстовых форматах и т.д.

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

                                                  Писать класс, для того чтоб в одном месте его вызвать - как по мне уже слишком . Че реплейсом не сделать? Хотя есть и без манипуляторов решения.
                                                  Сообщение отредактировано: Wound -
                                                    Ну и плюс ко всему, плюсы изначально делались так, что в них есть кирпичи, а ты из них что то строишь и это было круто. Нужен тебе кирпич в форме буквы Г, ты взял три кирпича, слепил из них букву Г, и вуаля. А с новыми стандартами - в язык начали тащить всякую чушь, в погоне за всякими новомодными языками. И вместо того чтоб следовать принципу - ты дай кирпичь, а уж букву Г я и сам слеплю, решили пойти по тупому пути. И добавлять уже целые алгоритмы, которые объединяются и представляют из себя нечто очень узконаправленное. При этом по отдельности - эти алгоритмы не реализованы. И в итоге получается ситуация, букву П слепили и засунули в библиотеку из 5 кирпичей, а букву Г не додумались. В итоге получается черти что и с боку бантик. Вы или тогда уже как в тех языках, за которыми вы гонитесь, вводите все подряд, либо делайте кирпичи, а уж пользователь сам разберется какую фигуру ему из них сложить надо. Потому что все это вызывает массу вопросов.

                                                    Добавлено
                                                    Цитата macomics @
                                                    Если надо избавиться от кавычек, тогда что мешает сделать так

                                                    Мешает то, что это костыль, причем жесткий.

                                                    Добавлено
                                                    Ну и в третий раз спрошу - будут примеры того, как по феншую экранировать символы в строке, в плюсах? Если что, один из вариантов решения я уже запилил, но он больше похож на то, как стрельба из пушки по воробьям. Но в принципе че делать, если комитетчики не могут базовые алгоритмы в язык ввести, зато всякую чушь тащут.
                                                    Сообщение отредактировано: Wound -
                                                      Цитата Wound @
                                                      Мне надо строку заэкранировать и послать в JSON, начал гуглить что есть в плюсах, нашел эту функцию std::quoted, вроде она делает то, что надо, но добавляет в начало и конец строки - кавычки. Теперь от них избавляться надо по тупому

                                                      Можешь чуть подробнее рассказать? Зачем избавляться от кавычек, если в json строковые объекты тоже в кавычках задаются?

                                                      Добавлено
                                                      Или ты весь json сразу через это гоняешь?
                                                        Цитата D_KEY @
                                                        Можешь чуть подробнее рассказать? Зачем избавляться от кавычек, если в json строковые объекты тоже в кавычках задаются?

                                                        Попробуй выполнить следующий код:
                                                        ExpandedWrap disabled
                                                          #include <iostream>
                                                           
                                                          int main()
                                                          {
                                                              std::string user = "Admin";
                                                              std::string password = "P@$$w0rd\"!!1";
                                                              
                                                              std::string jsonRequest = "{\"Username\":\"" + user + "\",\"Password\":\"" + password + "\"}";
                                                              
                                                              std::cout << jsonRequest << std::endl;
                                                          }


                                                        Получишь строку со следующим содержимым
                                                        ExpandedWrap disabled
                                                          {"Username":"Admin","Password":"P@$$w0rd"!!1"}


                                                        Потом, ну если уж совсем наглядно, скопируй выходную эту строку, и подставь ее аргументом в POST запрос например CURL тулзы. Скорее всего ты получишь ошибку, что то типа:
                                                        Цитата

                                                        HTTP/1.1 400 Bad Request
                                                        ...


                                                        {"errors":{"Password":["After parsing a value an unexpected character was encountered: 7. Path 'Password', line 1, position 53."]},"type":"https://tools.ietf.org/html/rfc7231#section...quot;:"One or more validation errors occurred.","status":400...

                                                        Для того, чтоб кавычка в поле Password была законной, ее нужно экранировать для формата JSON(и не только для него, в линуксе например в командной строке наблюдаются глюки, когда вводишь ! знак в строке запроса, в качестве пароля, сносит башню и bash уже не отображает нормально историю запроса, скорее всего это как то связано с неэкранированием символа, ну короче ноги растут от туда).

                                                        А чтоб запрос был правильным, надо строку с паролем(да и с юзером тоже) экранировать, чтоб запрос выглядел вот так:
                                                        ExpandedWrap disabled
                                                          {"Username":"Admin","Password":"P@$$w0rd\"!!1"}


                                                        Добавлено
                                                        Цитата D_KEY @
                                                        Или ты весь json сразу через это гоняешь?

                                                        Поле Password и User только экранировать надо. Зачем же весь json ? ты как с CURL'ом не работал что ле? Или с другой тулзой, где надо данные в json формате гонять ?

                                                        Добавлено
                                                        Цитата D_KEY @
                                                        Зачем избавляться от кавычек, если в json строковые объекты тоже в кавычках задаются?

                                                        В том и дело, что в JSON, они либо все экранируются слешами, либо только строки в кавычках. А тут что внутри - экранирует, при этом по краям добавляет кавычки, не экранированные. Т.е. получаешь строку
                                                        "P@$$w0rd\"!!1" с неэкранированными кавычками.
                                                        Сообщение отредактировано: Wound -
                                                          Цитата Wound @
                                                          Поле Password и User только экранировать надо

                                                          Именно. И граничные кавычки тоже доверить системному экранированию, а не самостоятельно вставлять.
                                                          Причём для названий атрибутов это тоже работает.
                                                          Попробуй выполнить следующий код:
                                                          ExpandedWrap disabled
                                                            #include <iostream>
                                                            #include <iomanip>
                                                            int main() {
                                                                std::string user = "Admin";
                                                                std::string password = "P@$$w0rd\"!!1";
                                                                std::stringstream jsonRequest;
                                                                jsonRequest << "{" << std::quoted("Username") << ":" << std::quoted(user) << "," << std::quoted("Password") << ":" << std::quoted(password) << "}";
                                                             
                                                                std::cout << jsonRequest.str() << std::endl;
                                                            }


                                                          Добавлено
                                                          Как ты сам сказал, «или либа, или кирпичи». Если доверяешь либе экранирование — доверяй до конца
                                                            Wound, так зачем ты кавычки сам добавляешь при формировании json? std::quoted их уже добавила.

                                                            Добавлено
                                                            Цитата Wound @
                                                            В том и дело, что в JSON, они либо все экранируются слешами, либо только строки в кавычках. А тут что внутри - экранирует, при этом по краям добавляет кавычки, не экранированные. Т.е. получаешь строку
                                                            "P@$$w0rd\"!!1" с неэкранированными кавычками.

                                                            Так и в json нужны кавычки обрамляющие у строкового значения.
                                                            Как ты формируешь json? Если через какую-то библиотеку, то она сама должна экранировать все, если сам, то просто не добавляй свои кавычки, делай через std::quoted.
                                                            Сообщение отредактировано: D_KEY -
                                                              Цитата D_KEY @

                                                              Wound, так зачем ты кавычки сам добавляешь при формировании json? std::quoted их уже добавила.

                                                              Это не я. Оно так было. И было там без экранирования, это же пример.

                                                              Добавлено
                                                              Цитата kopilov @
                                                              Именно. И граничные кавычки тоже доверить системному экранированию, а не самостоятельно вставлять.

                                                              Так в том и дело что граничные кавычки не экранируются, а просто вставляются, безусловно. О чем и речь.
                                                                Читал-читал, так и не понял. Wound нашел багу или фичу? :)
                                                                  Цитата Wound @
                                                                  Так в том и дело что граничные кавычки не экранируются, а просто вставляются, безусловно. О чем и речь.

                                                                  Ну так они правильно вставляются. Просто не вставляй еще одни.

                                                                  Добавлено
                                                                  Цитата Wound @
                                                                  Это не я. Оно так было.

                                                                  Ну так убери оттуда кавычки при использовании quoted и будет то, что надо :-?

                                                                  Добавлено
                                                                  И еще интересно, как ты думаешь, что означает quoted на английском?
                                                                    Что делает std::quoted, есть ли там бага (или только фича) и как это можно применить — вроде, все поняли :)

                                                                    Wound, если изначальная проблема не решена — предлагаю создать новую тему, где будет чётче описан кейс и желаемое поведение
                                                                      Цитата D_KEY @
                                                                      И еще интересно, как ты думаешь, что означает quoted на английском?

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


                                                                      Цитата kopilov @
                                                                      Wound, если изначальная проблема не решена — предлагаю создать новую тему, где будет чётче описан кейс и желаемое поведение

                                                                      Свою проблему я решил еще до создания темы. Это так, чисто было побубнеть.
                                                                        Цитата Wound @
                                                                        Это так, чисто было побубнеть.

                                                                        Спасибо, хорошо посидели побубнели :D
                                                                          Цитата Wound @
                                                                          Цитата D_KEY @
                                                                          И еще интересно, как ты думаешь, что означает quoted на английском?

                                                                          Так я ж не против. Пусть оно берет в кавычки - нафига она тогда экранирует.

                                                                          Потому что в противном случае получится некорректная строка внутри. Для того, чтобы корректно взять в кавычки, необходимо экранировать кавычки внутри строки.
                                                                            Цитата D_KEY @
                                                                            Потому что в противном случае получится некорректная строка внутри.

                                                                            С чего вдруг внутри получится некорректная строка, если тебе просто нужно обернуть то что у тебя есть в кавычки? Она то как раз будет корректной, ты просто получишь закавыченный контент. Для кого оно станет некорректной то?

                                                                            Добавлено
                                                                            Цитата D_KEY @
                                                                            Для того, чтобы корректно взять в кавычки, необходимо экранировать кавычки внутри строки.

                                                                            Да нет конечно.
                                                                            ExpandedWrap disabled
                                                                              #include <iostream>
                                                                              #include <format>
                                                                               
                                                                              using namespace std;
                                                                               
                                                                              int main()
                                                                              {
                                                                                  std::string str = "\"str\"ing\"";
                                                                                  std::cout << std::format("\"{}\"", str);
                                                                                  
                                                                               
                                                                                  return 0;
                                                                              }

                                                                            Вот что тут в выводе некорректного по твоему?
                                                                            ExpandedWrap disabled
                                                                              ""str"ing""


                                                                            Добавлено
                                                                            Ладно, что то я подустал переливать из пустого в порожнее. Тем более щас тут дел много. Некогда мне спорить уже.
                                                                              Цитата Wound @
                                                                              Она то как раз будет корректной, ты просто получишь закавыченный контент.

                                                                              Так не получишь. Ты легко можешь получить ""str"ing"", т.е. сначала пустая закавыченная строка, потом str без кавычек, потом закавыченный "ing" и потом одиначная кавычка.
                                                                              Соответственно, прежде чем просто поставить символ " в начало и в конец строки, нужно экранировать кавычки внутри. И quoted позволяет это сделать и поддерживает минимальную кастомизацию для указания правил экранирования.
                                                                                Кто-нибудь может-таки поведать великую тайну: чего надо-то?
                                                                                  Qraizer, по всей видимости, надо
                                                                                  Цитата Wound @
                                                                                  чисто было побубнеть.
                                                                                    Цитата D_KEY @
                                                                                    Соответственно, прежде чем просто поставить символ " в начало и в конец строки, нужно экранировать кавычки внутри.

                                                                                    Для чего их нужно экранировать? Ты опять все в кучу сыпешь. Экранирование нужно тогда, когда тебе важно чтоб вот эта кавычка не воспринималась как спецсимвол. А чтоб она не воспринималась, как спецсимвол, а как обычный текст - ее собственно и нужно экранировать. Так вот, для того, чтоб что то взять в кавычки - экранировать ничего не нужно. Достаточно окавычить исходную строку. Поэтому quoted() и какой нибудь условный escape() - это две разные вещи. Одно просто берет и все спецсимволы в строке - экранирует. А другое просто берет и оборачивает строку кавычками.

                                                                                    Добавлено
                                                                                    Цитата Qraizer @
                                                                                    Кто-нибудь может-таки поведать великую тайну: чего надо-то?

                                                                                    Да уже ничего не надо.
                                                                                      Цитата Qraizer @
                                                                                      Кто-нибудь может-таки поведать великую тайну: чего надо-то?

                                                                                      Просто Киле нужен был кавычкенг, а он использовал квотинг. Ну или наоборот :lool: И оно не так заработало :lool:
                                                                                        Цитата Qraizer @
                                                                                        Кто-нибудь может-таки поведать великую тайну: чего надо-то?

                                                                                        Чтобы либа подстроилась под то, что у кого-то уже написаны кавычки для обрамления и просто делала только экранирование без добавление " в начале и конце строки.

                                                                                        Добавлено
                                                                                        Цитата Wound @
                                                                                        Экранирование нужно тогда, когда тебе важно чтоб вот эта кавычка не воспринималась как спецсимвол.

                                                                                        Мне нужно, чтобы кавычка внутри не воспринималась как кавычка.

                                                                                        Добавлено
                                                                                        Цитата Wound @
                                                                                        Так вот, для того, чтоб что то взять в кавычки - экранировать ничего не нужно. Достаточно окавычить исходную строку

                                                                                        Нет. Не достаточно.
                                                                                        Потому что "aaa"bbb"aa" закавычена некорректно, т.к. кавычки внутри остались и интерпретируются как кавычки.

                                                                                        Добавлено
                                                                                        Цитата Wound @
                                                                                        Поэтому quoted() и какой нибудь условный escape() - это две разные вещи. Одно просто берет и все спецсимволы в строке - экранирует. А другое просто берет и оборачивает строку кавычками.

                                                                                        Условный escape() может быть полезен, да. Но описанный тобой quoted() является бесполезным.

                                                                                        Добавлено
                                                                                        Цитата Wound @
                                                                                        А другое просто берет и оборачивает строку кавычками.

                                                                                        Зачем? Если он не будет экранировать кавычки внутри, то как ты предлагаешь его использовать? Только в связке с escape() и будет иметь смысл это делать. Так и сделано в std.
                                                                                        То, что не помешал бы некий отдельный escape(), который бы не добавлял кавычки - согласен, можно было б. Но quoted вполне справляется с задачей.
                                                                                        Сообщение отредактировано: D_KEY -
                                                                                          Цитата D_KEY @
                                                                                          Мне нужно, чтобы кавычка внутри не воспринималась как кавычка.

                                                                                          Тогда очевидно тебе нужно экранирование, а не закавычивание.


                                                                                          Цитата D_KEY @
                                                                                          Нет. Не достаточно.
                                                                                          Потому что "aaa"bbb"aa" закавычена некорректно, т.к. кавычки внутри остались и интерпретируются как кавычки.

                                                                                          Типа ты споришь ради спора? Если тебе надо экранирование - то экранируй строку. Причем тут закавычивание? Не, не хочу я с тобой троллем вести диалог, ты несешь чушь какую то. Я тебе про васю, ты мне в ответе про петю. Все, иди с кем то другим общайся.
                                                                                          Сообщение отредактировано: Wound -
                                                                                            Цитата Wound @
                                                                                            Цитата D_KEY @
                                                                                            Мне нужно, чтобы кавычка внутри не воспринималась как кавычка.

                                                                                            Тогда очевидно тебе нужно экранирование, а не закавычивание.

                                                                                            Очевидно, что закавычивание, которое не умеет экранировать кавычки внутри, бесполезно.

                                                                                            Добавлено
                                                                                            Цитата Wound @
                                                                                            Типа ты споришь ради спора? Если тебе надо экранирование - то экранируй строку. Причем тут закавычивание? Не, не хочу я с тобой троллем вести диалог, ты несешь чушь какую то. Я тебе про васю, ты мне в ответе про петю. Все, иди с кем то другим общайся.

                                                                                            Ты создаешь кликбейтную тему, ругаешься на стандартную библиотеку, не можешь толком объяснить, зачем ты потом сам ставишь ещё один кавычки, сам признаешься, что тему создал ради "побубнеть", а тролль я :D
                                                                                            Сообщение отредактировано: D_KEY -
                                                                                            0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                                                                            0 пользователей:


                                                                                            Рейтинг@Mail.ru
                                                                                            [ Script execution time: 0,1484 ]   [ 17 queries used ]   [ Generated: 24.09.23, 14:33 GMT ]