2012-06-13 1 views
1

Если у меня есть указатель на символ, содержащий NULL-байты, есть ли встроенная функция, которую я могу использовать для поиска длины или мне просто нужно написать свою собственную функцию? Кстати, я использую gcc.C Программирование: найти длину символа * с нулевыми байтами

EDIT:

Если упоминали указатель на символ был создан с помощью таНос().

+0

Во-первых, указатели на символы не содержат NUL-байтов, они указывают на память, содержащую NUL-байты. Во-вторых, как вы * определяете * длину строки, содержащей NUL байты? То есть, как вы узнали бы, что достигли конца? –

ответ

8

Если у вас есть указатель , тогда ТОЛЬКО способ знать размер - хранить размер отдельно или иметь уникальное значение, которое завершает строку. (обычно '\0') Если у вас нет ни одного из них, это просто невозможно.

EDIT: поскольку вы указали, что вы выделили буфер, используя malloc, тогда ответ будет приведен выше. Вам нужно либо запомнить, сколько вы выделили malloc, либо просто иметь конечное значение.

Если вам случится иметь массив (например: char s[] = "hello\0world";), то вы можете прибегнуть к sizeof(s). Но будьте очень осторожны, как только вы попытаетесь с помощью указателя, вы получите размер указателя, а не размер массива. (но strlen(s) будет равен 5 т.к. оно доходит до первого '\0').

Кроме того, массивы распад указателям при передаче функций. Поэтому, если вы передадите массив функции, вы вернетесь к квадрату.

Примечание:

void f(int *p) {} 

и

void f(int p[]) {} 

и

void f(int p[10]) {} 

все то же. Во всех трех версиях p является указателем , а не массивом.

+0

Я бы заменил ваш пример, скажем, 'char s [] =" hello \ 0world "', чтобы связать его с вопросом. –

+0

@ Jim: достаточно справедливо :-) –

1

Откуда вы знаете, где заканчивается строка, если она содержит NULL байты как часть этого? Разумеется, никакая встроенная функция не может работать с такими строками. Он будет интерпретировать первый нулевой байт как конец строки.

Если вам нужна длина, вам придется хранить ее самостоятельно. Имейте в виду, что стандартные функции строки библиотеки будут корректно работать с такими строками, как no.

1

Вам нужно будет отслеживать длину самостоятельно.

Строки C: null Оконченное окончание, что означает, что первый символ нулевой последовательности указывает конец строки. Все встроенные строковые функции полагаются на это, поэтому, если у вас есть буфер, который может содержать NULL как часть данных, вы не можете их использовать.

Поскольку вы используете malloc, вам может потребоваться отслеживать два размера: размер выделенного буфера и количество символов в этом буфере, которые являются достоверными данными.

Смежные вопросы