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 не включает нулевой ограничитель.