Как узнать длину char
Char*. Как определить размер строки?
Добрый день!
Вопрос вроде бы на первый взгляд простой, но ответ на него найти не получается.
Как определить разме строки?
Результат ниже приведенного кода:
Найти размер динамической строки char
char *text = new char; *text=’\0′; cout 39
Добавлено через 2 минуты
Согласен. я наверное привел не совсем корректный пример, хотел сократить .
Вот более полный и корректный пример.
Суть в том, что я загружаю в буфер char* файл и пытаюсь понять его размер.
Смотря в каком контексте использовать слово «размер».
Если для выделения памяти, то надо конечно учесть терминирующий ноль.
А если для кол-ва символов, то здесь и вовсе возможны варианты с кодировками.
Добавлено через 2 минуты
mibin, если не считать наличие cout, то твой код по сути сишный, а не плюсовый. И перед выполнением fread для буфера должна быть выделена память в нужном кол-ве.
Да, вот код где я выделил память для buffer.
Ошибка тут ушла, а вот результат итоговый все равно не верен.
Это тестовый пример, итоговый содержит в себе классы.
Суть, в том чтобы передать в функцию некую строку и определить в этой функции размер строки, и совершенно не важно откуда эта строка взялась, была ли загружа из файла или кто-то руками что-то написал.
Как мы видели выше, если написать строку руками, то все верно получается, размер определился корректно, но стоило загрузить строку из файла, то размер буфера не может определится.
Добавлено через 4 минуты
Это не одна строка, это может быть строка, а может быть файл с изображением или музыкой и т.д.
Добавлено через 47 секунд
Преобразование char в char* или разделить на две строки
Пытаюсь сделать программу под linux. Возникла проблема, описанная в заголовке. Мне нужно разделить.
Строка: чем отличается строки string, char, char*?
Помогите разобраться,совсем плохо идёт,чем отличается строки string,char,char* И если можно пару.
Запись строки char в массив char
Глупый вопрос, но что поделать, многое забыл. Хочу записть строку типа char в массив строк типа.
Как скопировать содержимое строки char?
У меня в структуре есть член структуры char* text; и const temp char* = CharToDouble(10) Что-то у.
Размер символьного массива
Прошу простить, что тревожу столь банальными вопросами, но сам додумать не могу.
Необходимо узнать не длину этой строки, а сколько байт занимает данный массив в памяти. strlen() вернет длину, которая будет эквивалентна размеру данного массива, т.к. 1 char = 1 байт, это понятно. Но как обратиться именно к размеру в памяти?
На мой глупый ум приходит только:
Почему размер символьного массива должен быть больше на 1 символ, а не на 2?
Привет! Пока читал учебник Шилдта, возник вопрос: Почему Герберт Шилдт говорит, что следует.
Заполнение массива значениями из символьного массива
есть массив символов char z;есть целочисленный массив int b;каждый символ z это цифра 0-9 нужно в.
Обработка символьного массива
Задание по вычислительно
Сортировка символьного массива
Помогите пожалуйста написать прогу на C++. Нужно отортировать матрицу из симовлов по первому.
Я тут подумал, sizeof тут, пожалуй, не помощник. Он разве дает представление о байтах?
а смысл длину строки множить на размер указателя?
лучше?
Или я что-то жестко путаю.
Добавлено через 33 секунды
Jupiter,
Откуда?
В смысле не так спросил)) Имел в виду к чему Вы клоните? Как в таком случае узнать размер wchar_t? Вы сказали, что strlen() +1 даст то, что я хочу, правильно? Я предположил, что раз эта штука работает для char почему бы ей не сработать и для wchar_t, м?
На мой (глупый) взгляд strlen() + 1 это всего лишь подгонка. Просто мы в курсе, что размер чара равен 1 байт и ориентируемся на это. Мол длина строки = размеру. Но истинный размер (в байтах) мы не получаем.
Вычисление длины строки без использования strlen()
Хотел бы задать такой вопрос, как можно вычислить длину строки, без использования функции вычисления длины строки strlen()?
9 ответов 9
Можно. Длиной строки по сути является номер позиции символа ‘\0’:
когда-то я писал примерно так.
На 32-битных процессорах так получается быстрее:
Тут предполагается, что входная строка выровнена до 32-битной границы (конечно, будет работать и без выравнивания, но тогда весь смысл теряется).
Будет подсчитана длина всех строк, переданных в качестве параметров (some_string)
Итерация начинается с единицы, т.к. первый параметр всегда имя программы.
Собственно strlen так работает =)
Вот таким не хитрым способом можно:
Ну а как же могли забыть это? Хоть и платформенно-специфичное, конечно 🙂
Всё ещё ищете ответ? Посмотрите другие вопросы с метками c++ или задайте свой вопрос.
Связанные
Похожие
Подписаться на ленту
Для подписки на ленту скопируйте и вставьте эту ссылку в вашу программу для чтения RSS.
дизайн сайта / логотип © 2021 Stack Exchange Inc; материалы пользователей предоставляются на условиях лицензии cc by-sa. rev 2021.12.15.41030
Нажимая «Принять все файлы cookie» вы соглашаетесь, что Stack Exchange может хранить файлы cookie на вашем устройстве и раскрывать информацию в соответствии с нашей Политикой в отношении файлов cookie.
Как вы определяете длину unsigned char *?
Как вы определяете длину unsigned char *?
Для фактического размера указателя:
Если вам нужна длина строки:
Для этого может быть два значения. Вы просто хотите узнать, насколько велика тип указателя? Если это так, то ответ Joce правильный
Если вы хотите знать, сколько элементов указывает указатель, это немного сложнее. Если это строка стиля C, то strlen или какой-то вариант – ваш лучший вариант.
Однако, если это всего лишь указатель на unsigned char, который не имеет отношения к строке стиля C, тогда нет способа надежно достичь того, что вы ищете. C/С++ не связывает поле длины с указателем. Вам нужно будет передать длину с помощью указателя или использовать вектор типа, который хранит как указатель, так и длину.
В идеальном мире вы этого не делаете. Вы используете char * для строк стиля C (которые имеют NUL-конец и вы можете измерить длину), а unsigned char * – только для данных байта (который поставляется с его длиной в другом параметре или что угодно, и что вы, вероятно, попадете в контейнер STL ASAP, например vector или basic_string ).
Коренная проблема заключается в том, что вы не можете делать переносные предположения о том, являются ли представления хранилища char и unsigned char одинаковыми. Они обычно есть, но им разрешено не быть. Таким образом, нет строковых библиотечных функций, которые работают с unsigned char *, только на char *, и в общем случае безопасно отличать unsigned char * с подписанным char * и обрабатывать результат как строка. Поскольку char может быть подписан, это означает, что без кавычек unsigned char * to char *.
Однако, 0 всегда одно и то же представление значения в unsigned char и char. Поэтому в неидеальном мире, если у вас есть строка стиля C откуда-то, но она появилась как unsigned char *, то вы (а) добавили ее в char * и продолжаете с ней, но также (б) узнайте, кто сделал это с вами, и попросите их, пожалуйста, прекратить.
Вы хотите, чтобы длина указателя, которая была бы int. Если вы хотите указать длину строки, на которую указывает указатель, используйте параметр strlen:
например
Размер указателя: sizeof (без знака char *)
Размер строки: strlen (без знака char *)
Многобайтные символы получаются как:.multi byte
Если вы используете С++ и строку в unsigned char *, вам лучше сначала вставить его в std::string, прежде чем манипулировать им. Таким образом, вы можете делать с ним всевозможные вещи и по-прежнему иметь возможность получать длину() и/или емкость(), когда захотите.
Я предполагаю, что вы делаете вещи в указанном массиве, чтобы сделать его размер непостоянным. Если вы просто выделяете, устанавливаете и забываете, вы всегда можете сохранить фактический размер распределения массива в отдельной переменной – или лучше, создать struct/class.
Более сложный, чем этот, и вы повторно изобретаете std::string.
Без знака char * Предположим, вы имеете в виду строку, расположенную на этом указателе. В этом случае это будет:
Однако это только найдет позицию \0. Нет гарантии, что это фактический размер выделенного блока памяти.
Строки в языке C
Строки в C, как и в большинстве языков программирования высокого уровня рассматриваются как отдельный тип, входящий в систему базовых типов языка. Так как язык C по своему происхождению является языком системного программирования, то строковый тип данных в C как таковой отсутствует, а в качестве строк в С используются обычные массивы символов.
Исторически сложилось два представления формата строк:
Формат ANSI устанавливает, что значением первой позиции в строке является ее длина, а затем следуют сами символы строки. Например, представление строки «Моя строка!» будет следующим:
11 ‘М’ ‘о’ ‘я’ ‘ ‘ ‘с’ ‘т’ ‘р’ ‘о’ ‘к’ ‘а’ ‘!’
В строках с завершающим нулем, значащие символы строки указываются с первой позиции, а признаком завершения строки является значение ноль. Представление рассмотренной ранее строки в этом формате имеет вид:
‘М’ ‘о’ ‘я’ ‘ ‘ ‘с’ ‘т’ ‘р’ ‘о’ ‘к’ ‘а’ ‘!’ 0
Объявление строк в C
Строки реализуются посредством массивов символов. Поэтому объявление ASCII строки имеет следующий синтаксис:
char имя[длина];
Объявление строки в С имеет тот же синтаксис, что и объявление одномерного символьного массива. Длина строки должна представлять собой целочисленное значение (в стандарте C89 – константа, в стандарте C99 может быть выражением). Длина строки указывается с учетом одного символа на хранение завершающего нуля, поэтому максимальное количество значащих символов в строке на единицу меньше ее длины. Например, строка может содержать максимально двадцать символов, если объявлена следующим образом:
char str[21]; Инициализация строки в С осуществляется при ее объявлении, используя следующий синтаксис:
char str[длина] = строковый литерал;
Строковый литерал – строка ASCII символов заключенных в двойные кавычки. Примеры объявления строк с инициализацией:
char str1[20] = «Введите значение: «, str2[20] = «»;
const char message[] = «Сообщение об ошибке!»;
Работа со строками в С
Так как строки на языке С являются массивами символов, то к любому символу строки можно обратиться по его индексу. Для этого используется синтаксис обращения к элементу массива, поэтому первый символ в строке имеет индекс ноль. Например, в следующем фрагменте программы в строке str осуществляется замена всех символов ‘a’ на символы ‘A’ и наоборот.
Массивы строк в С
Объявление массивов строк в языке С также возможно. Для этого используются двумерные массивы символов, что имеет следующий синтаксис:
char имя[количество][длина];
Первым размером матрицы указывается количество строк в массиве, а вторым – максимальная (с учетом завершающего нуля) длина каждой строки. Например, объявление массива из пяти строк максимальной длиной 30 значащих символов будет иметь вид:
Число строковых литералов должно быть меньше или равно количеству строк в массиве. Если число строковых литералов меньше размера массива, то все остальные элементы инициализируются пустыми строками. Длина каждого строкового литерала должна быть строго меньше значения длины строки (для записи завершающего нуля).
При объявлении массивов строк с инициализацией допускается не указывать количество строк в квадратных скобках. В таком случае, количество строк в массиве будет определено автоматически по числу инициализирующих строковых литералов.
Например, массив из семи строк:
Функции для работы со строками в С
Все библиотечные функции, предназначенные для работы со строками, можно разделить на три группы:
Ввод и вывод строк в С
Для ввода и вывода строковой информации можно использовать функции форматированного ввода и вывода (printf и scanf). Для этого в строке формата при вводе или выводе строковой переменной необходимо указать спецификатор типа %s. Например, ввод и последующий вывод строковой переменной будет иметь вид:
char str[31] = «»;
printf(«Введите строку: «);
scanf(«%30s”,str);
printf(«Вы ввели: %s”,str);
Недостатком функции scanf при вводе строковых данных является то, что символами разделителями данной функции являются:
Поэтому, используя данную функцию невозможно ввести строку, содержащую несколько слов, разделенных пробелами или табуляциями. Например, если в предыдущей программе пользователь введет строку: «Сообщение из нескольких слов», то на экране будет выведено только «Сообщение».
Для ввода и вывода строк в библиотеке stdio.h содержатся специализированные функции gets и puts.
Функция gets предназначена для ввода строк и имеет следующий заголовок:
char * gets(char *buffer);
Между тем использовать функцию gets категорически не рекомендуется, ввиду того, что она не контролирует выход за границу строки, что может произвести к ошибкам. Вместо нее используется функция fgets с тремя параметрами:
char * fgets(char * buffer, int size, FILE * stream);
Функция puts предназначена для вывода строк и имеет следующий заголовок:
int puts(const char *string);
Простейшая программа: ввод и вывод строки с использованием функций fgets и puts будет иметь вид:
Помимо функций ввода и вывода в потоки в библиотеке stdio.h присутствуют функции форматированного ввода и вывода в строки. Функция форматированного ввода из строки имеет следующий заголовок:
Функции форматированного вывода в строку имеют следующие заголовки:
Преобразование строк
В С для преобразования строк, содержащих числа, в численные значения в библиотеке stdlib.h
предусмотрен следующий набор функций:
double atof(const char *string); // преобразование строки в число типа double
int atoi(const char *string); // преобразование строки в число типа int
long int atol(const char *string); // преобразование строки в число типа long int
long long int atoll(const char *string); // преобразование строки в число типа long long int
Корректное представление вещественного числа в текстовой строке должно удовлетворять формату:
После символов E, e указывается порядок числа. Корректное представление целого числа в текстовой строке должно удовлетворять формату:
Помимо приведенных выше функций в библиотеке stdlib.h доступны также следующие функции преобразования строк в вещественные числа:
Аналогичные функции присутствуют и для преобразования строк в целочисленные значения:
Функции обратного преобразования (численные значения в строки) в библиотеке stdlib.h присутствуют, но они не регламентированы стандартом, и рассматриваться не будут. Для преобразования численных значений в строковые наиболее удобно использовать функции sprintf и snprintf.
Обработка строк
В библиотеке string.h содержаться функции для различных действий над строками.
Функция вычисления длины строки:
size_t strlen(const char *string);
Функции копирования строк:
Функции сравнения строк:
Функции осуществляют сравнение строк по алфавиту и возвращают:
положительное значение – если string1 больше string2;
отрицательное значение – если string1 меньше string2;
нулевое значение – если string1 совпадает с string2;
Функции объединения (конкатенации) строк:
Функции поиска символа в строке:
Функция поиска строки в строке:
char * strstr(const char *str, const char *substr);
Функция поиска первого символа в строке из заданного набора символов:
size_t strcspn(const char *str, const char *charset);
Функции поиска первого символа в строке не принадлежащему заданному набору символов:
size_t strspn(const char *str, const char *charset);
Функции поиска первого символа в строке из заданного набора символов:
char * strpbrk(const char *str, const char *charset);
Функция поиска следующего литерала в строке:
char * strtok(char * restrict string, const char * restrict charset);