char p[4]={'h','g','y'};
cout<<strlen(p);
Этот код печатает 3.
char p[3]={'h','g','y'};
cout<<strlen(p);
Это печатает 8.
char p[]={'h','g','y'};
cout<<strlen(p);
Это снова печатает 8.
Помогите мне, поскольку я не могу выяснить, почему три различных значения печатаются путем изменения размера массива.
strlen
начинается с указанного указателя и продвигается, пока не достигнет символа '\ 0'
. Если в вашем массиве нет '\ 0'
, это может быть любое число, пока не будет достигнуто '\ 0'
.
Другой способ достичь нужного числа (в случае, который вы показали) - использовать: int length = sizeof (p) / sizeof (* p);
, что позволит дать вам длину массива. Однако это не совсем длина строки, как определено в strlen
.
Как отмечает @John Dibling, причина того, что strlen
дает правильный результат в вашем первом примере, заключается в том, что вы выделили место для 4 символов, но использовали только 3; оставшийся 1 символ автоматически инициализируется значением 0, что является именно тем символом '\ 0'
, который ищет strlen
.
Это даст вам случайное число. strlen
требует, чтобы строки были завершены символом '\0
' для работы.
'\ 0'
завершить работу буфера символов.
char p[4]={'h','g','y', '\0'};
strlen
- это стандартная библиотечная функция, которая работает с строками (в смысле этого слова в языке Си). Строка определяется как массив значений char
, который заканчивается значением \ 0
. Если вы предоставите что-то, что не является строкой в strlen
, поведение будет неопределенным: код может дать сбой, код может дать бессмысленные результаты и т. Д.
В ваших примерах только первый предоставляет strlen
со строкой , поэтому она работает должным образом. Во втором и третьем случаях вы предоставляете не строку (не оканчивающуюся \ 0
), поэтому ожидаемые результаты не имеют смысла.
Только в вашем первом примере массив символов имеет нулевое окончание - два других примера не имеют нулевого окончания, поэтому вы не можете использовать strlen()
для них вполне определенным образом.
char p[4]={'h','g','y'}; // p[3] is implicitly initialized to '\0'
char p[3]={'h','g','y'}; // no room in p[] for a '\0' terminator
char p[]={'h','g','y'}; // p[] implicitly sized to 3 - also no room for '\0'
Обратите внимание, что в последнем случае, если бы вы использовали строковый литерал для инициализации массива, вы бы получили нулевой терминатор:
char p[]= "hgy"; // p[] has 4 elements, last one is '\0'
Это потому, что strlen () ожидает найти нулевой символ конца строки для строки. В этом случае у вас его нет, поэтому strlen () продолжает считать, пока не найдет \ 0 или не выдаст нарушение доступа к памяти, и ваша программа не умрет. РВАТЬ!