2015-01-19 2 views
2

Это может быть тривиально, и я надеюсь, что кто-то сможет это объяснить. Почему StrLen дает мне большее количество, чем это реальный размер массива символов вместо 4: Вот мой код:strlen дает большее количество, чем размер массива

#include <stdio.h> 
#include <string.h> 

    int main() 
    { 
     char szInput[4]; 
     szInput [0] = '1'; 
     szInput [1] = '1'; 
     szInput [2] = '1'; 
     szInput [3] = '1'; 

     printf ("The sentence entered is %u characters long.\n",(unsigned)strlen(szInput)); 
     return 0; 
    } 

Я думал, что я должен получать 4 как выход, но я получаю 6.

Введенное предложение составляет 6 символов.

ответ

4

strlen работает только в том случае, если нулевой ограничитель '\0' присутствует в массиве символов. (Он возвращает количество символов до, но не включая этот терминатор).

Если нет, то поведение программы не определено. Тот факт, что вы получаете ответ вообще, является полностью совпадением.

Если бы вы написали szInput[3] = '\0'; то ваша программа будет хорошо определена и ответ будет 3. Вы можете написать szInput[3] = 0; но '\0' часто является предпочтительным для ясности (и конвенции) при работе с char литералов.

+1

или используйте sizeof (szInput/sizeof (szInput [0])) – Simon

+1

@Simon не сообщают OP, чтобы сделать это, держу пари, что тогда OP выложит следующий вопрос: _char * x = malloc (100); strcpy (x, someString); printf («длина строки:% u \ n», sizeof (x)); «Почему это дает неправильное значение?) _ И кроме того, в случае строки с нулевым завершением, которая дала бы другую значение, чем 'strlen()'. –

2

Вы должны закончить строку с '\0', как это:

#include <stdio.h> 
#include <string.h> 

int main() { 

    char szInput[5]; 
    szInput [0] = '1'; 
    szInput [1] = '1'; 
    szInput [2] = '1'; 
    szInput [3] = '1'; 
    szInput [4] = '\0'; 

    printf ("The sentence entered is %u characters long.\n", (unsigned)strlen(szInput)); 

    return 0; 

} 
1

Отсутствующий '\0' в конце строки.

#include <stdio.h> 
#include <string.h> 

int main() 
{ 
    char szInput[5]; 
    szInput [0] = '1'; 
    szInput [1] = '1'; 
    szInput [2] = '1'; 
    szInput [3] = '1'; 
    szInput [4] = '\0'; 

    printf ("The sentence entered is %u characters long.\n", (unsigned int)strlen(szInput)); 
    return 0; 
} 

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

Все функции в заголовке string.h планирующим это, strlen() работает в пути, который будет вызывать неопределенное поведение в причине вы опускаете согласующие '\0', простая реализация будет выглядеть

size_t length; 
while (*(str++) != '\0') 
    length++; 

если '\0' никогда нашел, это могло читать за пределами.

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