На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Правила раздела:
1. Название темы - краткое описание кто/что против кого/чего
2. В первом сообщении - список параметров, по которым идет сравнение.
3. Старайтесь аргументировать свои высказывания. Фразы типа "Венда/Слюникс - ацтой" считаются флудом.
4. Давайте жить дружно и не доводить обсуждение до маразма и личных оскорблений.
Модераторы: Модераторы, Комодераторы
Страницы: (495) « Первая ... 391 392 [393] 394 395 ...  494 495  ( Перейти к последнему сообщению )  
> Delphi vs C++ vs C# , ну и Java немножко, где-то ближе к старшему байту номеров страниц
    Цитата MyNameIsIgor @
    При чём тут это? Всё, я больше не могу...

    незнаю, спроси у D_KEY, я тоже не понял причем тут это.
      Цитата KILLER @
      Цитата D_KEY @
      Я о том, что если ты предлагаешь простую передачу буфера туда-обратно, то для строки " KILLER "([ KILLER \0]) после trim в буфере будет [KILLER\0 \0].
      Теперь ты пытаешься вернуть буфер в std::string. И тут возникает два вопроса. Во-первых, как std::string определит размер буфера?

      Как он это делает сейчас?

      Сейчас ему это не нужно - ты ему не буфер возвращаешь, а передаешь С-строку ;)
      Ему, кстати, можно указать количество символов и тогда он не будет учитывать '\0'.

      Цитата
      Я хочу задать тебе тотже вопрос, вот именно какой длины будет строка, с учетом того, что для std::string '\0' не обладает никакими специальными особенностями сейчас, на любом выбранном тобою компиляторе?
      Вот код:
      ExpandedWrap disabled
        #include <iostream>
        #include <string>
         
        int main()
        {
         
           std::string s;
           const char* p = "str\0ing";
           s.assign(p);
           std::cout << s.length();
            
           return 0;
        }

      Я предполагаю что 3. Во всяком случае у меня так...

      Так тут ты явно передаешь С-строку.
      Попробуй так:
      ExpandedWrap disabled
        #include <iostream>
        #include <string>
         
        int main()
        {
         
           std::string s;
           const char p[] = "str\0ing";
           s.assign(p, sizeof(p));
           std::cout << s.length();
            
           return 0;
        }

      ;) Он у тебя не только '\0' в середине возьмет, он еще и последний будет символом считать :)
        D_KEY, речь идет именно о массиве печатных символов, бинарные буферы обсуждать тут я не собираюсь. ты от темы уходишь. если я возьму хоть сейчас, строку с '\0' всереждине, то у меня сишные функции, которые работают с С-строками, будут так же работать неверно. И толку их юзать я не вижу.
          Цитата KILLER @
          D_KEY, речь идет именно о массиве печатных символов, бинарные буферы обсуждать тут я не собираюсь. ты от темы уходишь. если я возьму хоть сейчас, строку с '\0' всереждине, то у меня сишные функции, которые работают с С-строками, будут так же работать неверно. И толку их юзать я не вижу.

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

            Почему? c_str ведь возвращает корректный буфер.
              Цитата D_KEY @
              теперь ответь, что больше подходит для работы с массивом, std::vector или std::string ;) ?

              std::array<char> ;)
                Цитата KILLER @
                Цитата D_KEY @
                Причем тут все это? Я тебе говорю, что если ты будешь просто возвращать буфер, то всякие trim все-равно будут работать некорректно.
                Тебе хочется стандартного класса строк для работы именно с С-строками. Его нет, т.к. он был бы полезен исключительно для обратной совместимости и ни для чего другого.

                Почему? c_str ведь возвращает корректный буфер.

                :wall:
                Если ты после trim вернешь буфер std::string'у то как он должен интерпретировать данные в буфере?
                  Цитата D_KEY @
                  Если ты после trim вернешь буфер std::string'у то как он должен интерпретировать данные в буфере?

                  если ты собрался на бинарный буфер натравливать сишные функции работающие с С-строкой, это твои проблемы, хоть сейчас, хоть тогда. Я тебе толкую о С-строках, а не о бинарных буферов. Сейчас ведь он как то интерпретирует то что я ему передаю после trim.
                  Сообщение отредактировано: KILLER -
                    Кстати.
                    Вот в первом приближении:

                    ExpandedWrap disabled
                      #include <string>
                       
                      struct c_str_char_traits : public std::character_traits<char>
                      {
                       
                          static int compare(const char_type* s1, const char_type *s2, size_t n)
                          {
                              return std::strncmp(s1, s2, n);
                          }
                       
                          static size_t length(const char_type *s1)
                          {
                              return std::strlen(s1);
                          }
                       
                          static char_type* copy(char_type* s1, const char_type* s2, size_t n)
                          {
                              return std::strncpy(s1, s2, n);
                          }
                       
                      };
                       
                      typedef std::basic_string<char, c_str_char_traits> nt_string;


                    А поскольку в новом стандарте:
                    Цитата
                    The char-like objects in a basic_string object shall be stored contiguously. That is, for any basic_string
                    object s, the identity &*(s.begin() + n) == &*s.begin() + n shall hold for all values of n such that 0
                    <= n < s.size().


                    То ты получишь все, что тебе нужно. И все будет работать.
                    Ну может что-то еще не учел в своих traits - сейчас нет времени проверять.

                    Добавлено
                    Цитата KILLER @
                    Цитата D_KEY @
                    Если ты после trim вернешь буфер std::string'у то как он должен интерпретировать данные в буфере?

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

                    Да причем тут бинарные буферы, если речь идет о просто trim?

                    Цитата
                    Сейчас ведь он как то интерпретирует то что я ему передаю после trim.

                    Сейчас он копирует то, что ты ему передаешь. Если передаешь указатель + размер - он скопирует все. Если передашь только указатель, он подумает, что это C-строка и скопирует все до '\0'.
                    Сообщение отредактировано: D_KEY -
                      Цитата D_KEY @
                      Вот в первом приближении:

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

                      Добавлено
                      Цитата D_KEY @
                      Да причем тут бинарные буферы, если речь идет о просто trim?

                      Тогда не понимаю, в чем у тебя вопрос касательно trim был?

                      Цитата D_KEY @
                      Сейчас он копирует то, что ты ему передаешь. Если передаешь указатель + размер - он скопирует все. Если передашь только указатель, он подумает, что это C-строка и скопирует все до '\0'.

                      ну и отлично, в чем проблемы? Или если мы добавим std::string'у новый метод, то от этого что то изменится?
                        Не, я прогнал. будут проблемы с итераторами и пр. :'(

                        Добавлено
                        Цитата KILLER @
                        Я хочу иметь эту совместимость встроенную в С++.

                        Совместимость чего с чем? Нет такого типа "С-строка".

                        Цитата
                        ну и отлично, в чем проблемы? Или если мы добавим std::string'у новый метод, то от этого что то изменится?

                        У него в буфере после trim будет лежать вот это: [KILLER\0<space><space>\0]
                        Обычный std::string интерпретирует это как строку из 10 символов и никакого специального символа для него не существует. Например, он спокойно найдет пробел.
                          Цитата KILLER @
                          Я же еще раз повторяю, мне нехочеца писать кучу оберток на каждый писк. Я хочу иметь эту совместимость встроенную в С++.

                          Мне не хочецца работать :'( Дайте мне в std выдаватель зарплаты! >:(
                            Цитата MyNameIsIgor @
                            Мне не хочецца работать :'( Дайте мне в std выдаватель зарплаты! >:(

                            о да, клевая работа
                            Цитата
                            писать кучу оберток на каждый писк
                            =)
                              korvin, лучше вбрось что-нибудь новенькое...
                                Цитата D_KEY @
                                Совместимость чего с чем? Нет такого типа "С-строка".

                                зато есть соглашение.

                                Цитата D_KEY @
                                У него в буфере после trim будет лежать вот это: [KILLER\0<space><space>\0]
                                Обычный std::string интерпретирует это как строку из 10 символов и никакого специального символа для него не существует. Например, он спокойно найдет пробел.

                                Это если ему указать размер, тогда да найдет.
                                1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
                                0 пользователей:
                                Страницы: (495) « Первая ... 391 392 [393] 394 395 ...  494 495


                                Рейтинг@Mail.ru
                                [ Script execution time: 0.5452 ]   [ 14 queries used ]   [ Generated: 30.07.26, 10:07 GMT ]