Почему Стрлен не работает на меня? - PullRequest
6 голосов
/ 09 апреля 2010
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.

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

Ответы [ 7 ]

27 голосов
/ 09 апреля 2010

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

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

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

4 голосов
/ 09 апреля 2010

Только у вашего первого примера есть массив символов с нулевым символом в конце - два других примера не имеют символьного завершения, поэтому вы не можете использовать 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'
1 голос
/ 09 апреля 2010

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

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

1 голос
/ 09 апреля 2010

попробуйте это:

char p[4]={'h','g','y', '\0'};
1 голос
/ 09 апреля 2010

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

0 голосов
/ 09 апреля 2010

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

0 голосов
/ 09 апреля 2010

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

char p[4]={'h','g','y', '\0'};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...