Как получить размер строки в байтах?
Как следует из названия, мой вопрос заключается в том, как получить размер строки в C
. Хорошо ли использовать sizeof
, если я объявил его (строку) в функции без malloc
в нем? Или, если я объявил его указателем? Что делать, если я инициализировал его с помощью malloc
? Я хотел бы получить исчерпывающий ответ.
Ответы
Ответ 1
Вы можете использовать strlen. Размер определяется конечным нулевым символом, поэтому передаваемая строка должна быть действительной.
Если вы хотите получить размер буфера памяти, который содержит вашу строку, и у вас есть указатель на него:
- Если это динамический массив (созданный с помощью malloc), невозможно получить
его размер, поскольку компилятор не знает, на что указывает указатель.
(проверьте это)
- Если это статический массив, вы можете использовать
sizeof
для получения его размера.
Если вас смущает разница между динамическими и статическими массивами, отметьте this.
Ответ 2
Используйте strlen
, чтобы получить длину строки с нулевым завершением.
sizeof
возвращает длину массива , а не строку. Если это указатель (char *s
), а не массив (char s[]
), он не будет работать, так как он вернет размер указателя (обычно 4 байта в 32-битных системах). Я считаю, что массив будет передан или возвращен как указатель, поэтому вы потеряете возможность использовать sizeof
для проверки размера массива.
Итак, , только если строка охватывает весь массив (например, char s[] = "stuff"
), будет использовать sizeof
для статически определенного массива, чтобы вернуть то, что вы хотите (и быть быстрее, поскольку ему не нужно было бы перебирать нулевой ограничитель) (если последний символ является нулевым терминатором, вам нужно будет вычесть 1). Если он не охватывает весь массив, он не вернет то, что вы хотите.
Альтернативой всему этому является сохранение размера строки.
Ответ 3
В то время как sizeof работает для этого конкретного типа строки:
char str[] = "content";
int charcount = sizeof str - 1; // -1 to exclude terminating '\0'
Это не работает, если str является указателем (sizeof возвращает размер указателя, обычно 4 или 8) или массив с указанной длиной (sizeof вернет счетчик байтов, соответствующий указанной длине, для типа char).
Просто используйте strlen().
Ответ 4
Если вы используете sizeof()
, тогда char *str
и char str[]
будут возвращать разные ответы. char str[]
вернет длину строки (включая ограничитель строки), в то время как char *str
вернет размер указателя (отличается в соответствии с компилятором).
Ответ 5
Мне нравится использовать:
(strlen(string) + 1 ) * sizeof(char)
Это даст вам размер буфера в байтах. Вы можете использовать это с помощью snprintf(), который может помочь:
const char* message = "%s, World!";
char* string = (char*)malloc((strlen(message)+1))*sizeof(char));
snprintf(string, (strlen(message)+1))*sizeof(char), message, "Hello");
Ура! Функция: size_t strlen (const char *s)