sizeof в c ++, показывающий размер строки один меньше

В C ++ я пытаюсь получить размер string скажем, «gibbs»;

Когда я использую функцию sizeof он возвращает мне размер меньше, чем один из фактического размера.

У меня есть код ниже:

  string s = "gibbs"; cout << sizeof(s) <<endl; 

и выход: 4. Я предполагаю, что это должно быть 5.

Как исправить эту проблему. Мы можем добавить +1 всегда к возврату sizeof, но это будет идеальное решение?

sizeof(s) дает размер объекта s , а не длину строки, хранящейся в объекте s .

Вам нужно написать следующее:

 cout << s.size() << endl; 

Обратите внимание, что std::basic_string (и по расширению std::string ) имеет функцию члена size() . std::basic_string также имеет функцию члена length которая возвращает то же значение, что и size() . Поэтому вы также можете написать это:

 cout << s.length() << endl; 

Я лично предпочитаю функцию члена size() , потому что другие контейнеры из стандартной библиотеки, такие как std::vector , std::list , std::map и т. Д., Имеют функции члена size() но не length() , То есть size() является равномерным интерфейсом для стандартных шаблонов classов библиотеки библиотеки. Мне не нужно помнить об этом специально для std::string (или любого другого шаблона classа контейнера). Функция-член std::string::length() - это отклонение в этом смысле.

sizeof(s) в вашем примере возвращает размер std::string , нет никакого отношения к содержанию того, на что указывают его члены.

Как исправить эту проблему. Мы можем добавить +1 всегда к возврату sizeof, но это будет идеальное решение?

нет, это ничего не решит, потому что значение является постоянным, а sizeof не обеспечивает того значения, которое вы ожидаете от него.

если вы хотите узнать количество символов, необходимых для символьной последовательности строки, вы можете использовать s.length() или s.size() – добавить 1 к этому значению, чтобы узнать размер, необходимый для завершенной строки.

также обратите внимание, что значение sizeof не будет согласованным между библиотеками и платформами. Реализации std::string могут сильно различаться. в частности, вы можете увидеть различия в размерах указателей, и вы можете увидеть небольшие оптимизации строк.

Потому что это размер типа строки в вашей системе, а не размер базовых данных. Например:

 #include  int main (void) { std::string s1 = "gibbs"; std::string s2 = "a much longer string"; std::cout << sizeof(s1) << '\n'; std::cout << sizeof(s2) << '\n'; std::cout << s1.length() << '\n'; std::cout << s2.length() << '\n'; return 0; } 

производит:

 4 4 5 20 

Другими словами, вы должны использовать std::string::length() чтобы получить длину ваших строк.

sizeof возвращает размер типа объекта, std::string , который в вашей системе равен 4 . Возможно, это связано с тем, что реализация std::string вы работаете, использует идиому pimpl, т. Е. Содержит только указатель на реальную реализацию, которую вы ищете, а указатели – 32-разрядные в вашей среде хоста , Скорее всего, вы используете реализацию std::string , выполняемую по std::string копирование на запись» , которая больше не соответствует спецификации со стандартом C ++ 11.

std::string определяется как специализация std::basic_string шаблона std::basic_string , в частности std::basic_string ; вы должны увидеть документацию по std::basic_string . взгляните на std::basic_string::size и std::basic_string::length .

 std::string s = "stackoverflow"; std::assert(s.size() == 13); 
  • Подсчитайте слова в R
  • Получить строковый символ по индексу - Java
  • Как использовать регулярное выражение в методе String.contains () в Java
  • Когда Java-строки интернированы?
  • Поиск подстроки в объекте NSString
  • Команды командной строки запуска
  • Какова цель выражения «new String (...)» в Java?
  • Как проверить, содержит ли строка только цифры в Java
  • Инициализация массива строк в Java
  • Сравнение строк и преобразование строк в Java
  • Как разбить строку на строки и включить разделители с помощью .NET?
  • Interesting Posts

    Неправильно ли использовать Диспетчер в моей модели ViewModel?

    Использовать RAID для настольного компьютера?

    Как я могу вернуть пользовательский код состояния HTTP из метода WCF REST?

    Советы для получения латте или соды из вашей клавиатуры?

    Каковы наилучшие методы для вложенных ресурсов REST

    Что это за разъем / порт / разъем на моем ноутбуке?

    Jqgrid: навигация по выбранной строке

    Amazon S3 – HTTPS / SSL – Возможно ли это?

    Почему double width = 50/110000; выход составляет 0,000000000000000?

    C # как преобразовать большую строку HEX в двоичную

    В диалоговом окне свойств диска Windows 7 отображается больше используемого пространства, чем общий размер файлов на диске

    Избегайте передачи null в качестве корня представления (необходимо разрешить параметры макета на корневом элементе раздутого макета)

    Инициализация переменных в C ++

    Ширина ввода в Bootstrap 3

    Java – Regex – Удалить комментарии

    Давайте будем гением компьютера.