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