const char* a;
как я могу убедиться, что строка 'a' завершена нулем? когда a = "abcd", и я делаю sizeof (a), я получаю 4. Означает ли это, что это не завершено нулем? если бы это было так, я бы получил 5?
const char* a;
как я могу убедиться, что строка 'a' завершена нулем? когда a = "abcd", и я делаю sizeof (a), я получаю 4. Означает ли это, что это не завершено нулем? если бы это было так, я бы получил 5?
Если вам передан массив char, который может содержать или не иметь нулевые данные в нем, действительно нет хорошего способа проверить. Лучшее, что вы можете сделать, это поиск нулевого символа до заданной длины certian (не бесконечно!). Но 0 - не совсем необычный байт данных для поиска в неинициализированной области памяти.
Это одна из многих вещей о стандарте строки C defacto, который многим не нравится. Нахождение длины строки, с которой клиент сталкивается, в лучшем случае является операцией поиска O (n) и худшей ошибкой сегментации.
Еще одна проблема, конечно, в том, что массивы и указатели взаимозаменяемы. Это означает, что array_name + 2
совпадает с &(array_name[2])
, а sizeof(a)
- sizeof(char*)
, а не длина массива.
sizeof(a)
дает размер указателя, а не массив символов, на которые указывает указатель. Это так же, как если бы вы сказали sizeof(char*)
.
Вам нужно использовать strlen()
для вычисления длины строки с завершающим нулем (обратите внимание, что возвращенная длина не включает нулевой ограничитель, поэтому strlen("abcd")
равно 4, а не 5). Или вы можете инициализировать массив строковым литералом:
char a[] = "abcd";
size_t sizeof_a = sizeof(a); // sizeof_a is 5, because 'a' is an array not a pointer
Строковый литерал "abcd"
имеет нулевое завершение; все строковые литералы имеют нулевое завершение.
Вы получаете 4
, потому что это размер указателя на вашей системе. Если вы хотите получить длину строки с нулевым завершением, вам нужна функция strlen
в стандартной библиотеке C.
Проблема заключается в том, что вы путаете sizeof()
, который является операцией времени компиляции с длиной строки, которая является операцией выполнения. Причина возврата 4 при запуске sizeof(a)
заключается в том, что a
является указателем, а типичный размер указателя в C - 4 байта. Чтобы получить длину строки, используйте strlen
.
Во втором вопросе, как убедиться, что строка завершена нулем. Единственный способ окончательно сделать это - обнулить конец строки. Учитывая только char*
, нет способа гарантировать 100%, что он правильно завершен нулем. Необходимо проявлять большую осторожность, чтобы гарантировать, что контракт между производителем и потребителем char*
понимается как кто заканчивает строку.
sizeof(a)
- sizeof(const char*)
, размер указателя. Содержимое a
не зависит от него. Для этого вам нужно strlen
.
Кроме того, все двухцилиндровые строковые литералы, такие как ваш "abcd"
в исходном коде, автоматически завершают нуль.
sizeof (a) возвращает размер const char *a
... не тот размер, на который он указывает. Вы можете использовать strlen(a)
для определения длины строки с нулевым завершением и нет, результат strlen не включает нулевой ограничитель.