Почему 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