Почему strlen не работающий на меня?

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.

Помогите мне, поскольку я не могу выяснить, почему три различных значения печатаются путем изменения размера массива.

6
задан 12 revs, 7 users 49% 13 April 2010 в 16:13
поделиться

7 ответов

strlen начинается с указанного указателя и продвигается, пока не достигнет символа '\ 0' . Если в вашем массиве нет '\ 0' , это может быть любое число, пока не будет достигнуто '\ 0' .

Другой способ достичь нужного числа (в случае, который вы показали) - использовать: int length = sizeof (p) / sizeof (* p); , что позволит дать вам длину массива. Однако это не совсем длина строки, как определено в strlen .

Как отмечает @John Dibling, причина того, что strlen дает правильный результат в вашем первом примере, заключается в том, что вы выделили место для 4 символов, но использовали только 3; оставшийся 1 символ автоматически инициализируется значением 0, что является именно тем символом '\ 0' , который ищет strlen .

27
ответ дан 8 December 2019 в 02:40
поделиться

Это даст вам случайное число. strlen требует, чтобы строки были завершены символом '\0' для работы.

1
ответ дан 8 December 2019 в 02:40
поделиться

'\ 0' завершить работу буфера символов.

char p[4]={'h','g','y', '\0'};
0
ответ дан 8 December 2019 в 02:40
поделиться

strlen - это стандартная библиотечная функция, которая работает с строками (в смысле этого слова в языке Си). Строка определяется как массив значений char , который заканчивается значением \ 0 . Если вы предоставите что-то, что не является строкой в strlen , поведение будет неопределенным: код может дать сбой, код может дать бессмысленные результаты и т. Д.

В ваших примерах только первый предоставляет strlen со строкой , поэтому она работает должным образом. Во втором и третьем случаях вы предоставляете не строку (не оканчивающуюся \ 0 ), поэтому ожидаемые результаты не имеют смысла.

1
ответ дан 8 December 2019 в 02:40
поделиться

Только в вашем первом примере массив символов имеет нулевое окончание - два других примера не имеют нулевого окончания, поэтому вы не можете использовать 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'
4
ответ дан 8 December 2019 в 02:40
поделиться

попробуйте так:

char p[4]={'h','g','y', '\0'};
1
ответ дан 8 December 2019 в 02:40
поделиться

Это потому, что strlen () ожидает найти нулевой символ конца строки для строки. В этом случае у вас его нет, поэтому strlen () продолжает считать, пока не найдет \ 0 или не выдаст нарушение доступа к памяти, и ваша программа не умрет. РВАТЬ!

0
ответ дан 8 December 2019 в 02:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: