Как узнать длину char c
как мне кажется, name — массив из 10 элементов.
sizeof должен вернуть размер массива (почти длину строки).
но возвращает или 4 — место занимаемое указателем (как мне кажется)
или размер одного чара, что лежит непосредственно по name.
Re: забыл задать вопрос.
| От: | Аноним |
| Дата: | 07.05.05 11:30 |
| Оценка: |
char *name=»123456789″;
как получить длину строки, лежащей по name?
Re[2]: забыл задать вопрос.
| От: | loki1000 |
| Дата: | 07.05.05 11:33 |
| Оценка: |
Здравствуйте, Аноним, Вы писали:
А>char *name=»123456789″;
А>как получить длину строки, лежащей по name?
Re: sizeof и длина строки
| От: | korzhik | |
| Дата: | 07.05.05 11:35 | |
| Оценка: | 4 (1) | |
Здравствуйте, Аноним, Вы писали:
А>
А> char *name="123456789"; А> int len1=sizeof(name); // len1 = 4; А> int len2=sizeof(*name); // len2 = 1; А> int len3=sizeof name; // len3 = 4; А>
А>как мне кажется, name — массив из 10 элементов.
неправильно. name это указатель.
Немножко теории:
«123456789» — строковый литерал,
имеет тип — массив десяти константных чаров,
и static storage duration, что, попросту говоря, обозначает что этот литерал доступен в течении всей продолжительности выполнения программы.
Этот литерал где то хранится, но где стандартом не оговаривается, но нам это знать и не надо.
Теперь если ты пишешь:
char* name = "123456789";
то указатель name будет просто указывать на строковый литерал, а если ты напишешь следуюшим образом:
char name[] = "123456789";
то name будет массивом из 10-ти символов, в который скопируется строковый литерал.
А>sizeof должен вернуть размер массива (почти длину строки).
sizeof возвращает количество байт занимаемое его операндом, то есть в твоём случае он вернёт размер указателя на твоей платформе.
А>но возвращает или 4 — место занимаемое указателем (как мне кажется)
да, это размер указателя
#include int main() < char* p = "123456789"; char name[] = "123456789"; std::cout sizeof(p) "\n"; std::cout sizeof(name) "\n"; >
4 10
Re[3]: забыл задать вопрос.
| От: | Аноним |
| Дата: | 07.05.05 11:37 |
| Оценка: |
Спасибо, loki1000!
L>ЗЫ: RTFM
Просто поняв, что строки в C++, это не строки в php. что substr() так просто не работает, то и strlen() наверно нет.
Еще раз спасибо, буду читать.
Как узнать длину массива char с пробелами [закрыт]
Закрыт. Этот вопрос не по теме. Ответы на него в данный момент не принимаются.
Вопросы с просьбами помочь с отладкой («почему этот код не работает?») должны включать желаемое поведение, конкретную проблему или ошибку и минимальный код для её воспроизведения прямо в вопросе. Вопросы без явного описания проблемы бесполезны для остальных посетителей. См. Как создать минимальный, самодостаточный и воспроизводимый пример.
Закрыт 7 лет назад .
Как узнать длину массива?
sizeof(ch)
не подходит потому что, когда он идет пробел, то на этом все заканчивается
Как определить длину массива в C++
По сути, когда мы говорим о длине массива, мы имеем в виду общее количество элементов, присутствующих в соответствующем массиве. Например, посмотрите на массив ниже:
int array1[] =
Размер (или длина) массива равна общему количеству элементов в нем. Следовательно, в данном случае это «5».
Способы определения длины массива в C++
Теперь давайте посмотрим на различные способы, с помощью которых мы можем выяснить длину массива в C++:
- поэлементный подсчет,
- begin() и end(),
- функция sizeof(),
- функция size() в STL,
- указатели.
Теперь давайте обсудим каждый метод подробно и с примерами.
1: Поэлементный подсчет
Самый очевидный способ – перебрать заданный массив и одновременно подсчитать общее количество перебранных элементов.
Но если мы заранее не знаем длину массива для итерации, то в таком случае мы не можем использовать цикл for. Эту проблему можно решить, используя простой цикл for-each. Внимательно посмотрите на приведенный ниже код.
#include #include using namespace std; int main() < int c; int arr[]=; cout cout
Вы получите такой результат:
The array is: 1 2 3 4 5 6 7 8 9 0 The length of the given Array is: 10
Как мы говорили выше, здесь мы перебираем весь массив arr, используя цикл for-each с итератором i. Значение счетчика c увеличивается по мере итерации. Когда перебор закончится, в c вы найдете длину данного массива.
2: Функции begin() и end()
Мы также можем вычислить длину массива, используя стандартные функции begin() и end(). Эти две функции возвращают итераторы, указывающие на начало и конец массива соответственно. Внимательно посмотрите на данный код:
#include #include using namespace std; int main() < //Given Array int arr[] = < 11, 22, 33, 44 >; cout
Следовательно, разница между возвращаемыми значениями двух функций end() и begin() дает нам размер или длину данного массива. Данный код вернет:
The Length of the Array is : 4
3: Функция sizeof()
Оператор sizeof() в C++ возвращает размер переданной переменной или данных в байтах. Кроме того, он возвращает общее количество байтов, необходимых для хранения массива. Следовательно, если мы просто разделим размер массива на размер, занимаемый каждым его элементом, мы узнаем общее количество элементов, присутствующих в массиве.
Давайте посмотрим, как это работает:
#include #include using namespace std; int main() < //Given array int arr[] = ; int al = sizeof(arr)/sizeof(arr[0]); //length calculation cout
В результате мы получим:
The length of the array is: 3
4: Функция size() в STL
В стандартной библиотеке есть функция size(), которая возвращает количество элементов в заданном контейнере (в нашем случае это массив).
#include #include using namespace std; int main() < //Given array arrayarr< 1, 2, 3, 4, 5 >; //Using the size() function from STL cout
В результате вы получите:
The length of the given Array is: 5
5: Определение длины массива с помощью указателей
Узнать длину массива можно с помощью указателей. Давайте посмотрим, как это делается:
#include #include using namespace std; int main() < //Given array int arr[6] = ; int len = *(&arr + 1) - arr; //*(&arr + 1) is the address of the next memory location // just after the last element of the array cout
В результате мы получим:
The length of the array is: 6
Выражение *(arr+1) выдает адрес области памяти сразу после последнего элемента массива. Следовательно, разница между ним и начальным местоположением массива (или базовым адресом, arr) показывает общее количество элементов, присутствующих в данном массиве.
Заключение
Итак, в этом мануале мы обсудили различные методы определения длины массива в C++. Все приведенные выше методы просты в использовании, однако мы предпочитаем применять цикл for-each – не только из-за удобочитаемости кода, но и из-за его кросс-платформенной надежности.
Язык C++
Для работы со строкам в C++ используется тип string . В разделе про потоки мы уже создавали объекты типа string и использовали их с операторами > . Рассмотрим этот тип подробнее.
Примеры создания объектов string :
string a; // пустая строка string b("abc"); // строка проинициализирована списком символов string c1(b); // c1 является копией b string c2 = b; // c2 является копией b string d('d', 10); // d = "dddddddddd"
Строки хранят в памяти последовательность объектов char , поэтому во многих случаях со строками можно работать как с массивом. Например, обращаться к символам через индекс.
string a("abz"); char c = a[2]; // 'z' char b = a.at(1); // 'b' a[2] = 'c'; // a = "abc"
Механизмы обращения к элементу через оператор [] и с помощью метода at() отличаются. В первом случае не происходит проверки того, что индекс меньше, чем длина строки. Если это условие не выполняется, то мы приходим к ситуации неопределенного поведения. Метод at() выполняет эту проверку и генерирует исключение в случае некорректного индекса. За это более безопасное поведение мы платим процессорным временем для дополнительной проверки.
По символам строки можно пройти в цикле:
string s("abcde"); for (char ch : s) cout <ch <' '; >
Узнать длину строки можно с помощью метода size() .
Строки можно конкатенировать с помощью оператора + или метода append :
string a("Hello, "); string b("world!"); string c = a + b; // "Hello, world!" a.append(b); // a = "Hello, world!" a += b; // a = "Hello, world!world!"
Добавить символ в конец строки можно с помощью метода push_back() , а удалить последний символ — с помощью метода pop_back() .
В типе string реализованы некоторые алгоритмы. Например, можно осуществлять поиск по строке:
string line("There are two needles in this haystack with needles."); string query("needle"); size_t found = line.find(query); // found = 14 if (found != string::npos) cout <"first '" <query <"' found at: " <found <'\n'; >
Метод find() возвращает позицию первого символа, которому соответствует совпадение. Если совпадений не найдено, возвращается специальная константа. size_t — это беззнаковый целочисленный тип.
Больше возможностей типа string можно найти в документации.
Документация
- en.cppreference.com/w/cpp/string/basic_string
- en.cppreference.com/w/cpp/header/cctype
- Введение
- Настройка рабочей среды
- Язык C++
- Работа с потоками ввода-вывода
- Строки
- Контейнеры стандартной библиотеки C++
- Эффективная передача параметров в функцию
- Алгоритмы стандартной библиотеки C++
- Итераторы
- Библиотеки numeric и random
- Классы
- Наследование
- Динамическое выделение памяти
- Обобщенное программирование