Почему strlen() в этом случае возвращает на единицу меньше ожидаемого числа?

Пример:

    {
        int a,b;
        char s1[]="ABCDEF";
        char s2[]="ZWXYZ";
        strcpy(s1,s2); 
        strcat(s1,"L#@");
        a=strlen(s1);
        b=strlen(s2);
        printf("%d%d",a,b);
    }

Возвращает 8 и 5. Я ожидал, что strlen вернет 9. Я думаю, что # или @ должны быть виновником здесь. Однако, когда я удаляю #, он возвращает 7, как будто # был посчитан. Таким образом, кажется, что strlen возвращает то, что я ожидаю, но минус один. Что здесь происходит?

2 ответа

Когда ты сказал

 strcat(s1,"L#@");

конкатенированная строка (результат) слишком длинна для s1, Он выходит за допустимые границы и, как результат, у вас неопределенное поведение.

Вы должны убедиться, что результат объединения может быть сохранен в целевой памяти. Другими словами, вы должны убедиться, что s1 достаточно велик, чтобы держать результат

      strcat(s1,"L#@");

Основной способ достижения этого - сделать цель достаточно большой, указав размер во время компиляции, что-то вроде

#define SIZE 16
....
char s1[SIZE]="ABCDEF";

и, используйте его соответственно.

здесь мы просто делаем s1 достаточно большой, чтобы вместить результат конкатенации.

Тем не менее, тип возврата strlen() является size_tтак что вы должны использовать %zu распечатать результат!

Не обращая внимания на тот факт, что вы пишете после конца строки....

После strcpy(s1,s2) s1 содержит "ZWXYZ".

После strcat(s1,"L#@") s1 содержит "ZWXYZL#@", который имеет длину ogf 8

Другие вопросы по тегам