Почему strcat() останавливает работу программы?
Потому что в strcat нужно передать указатель на строку, вы передаёте переменную z с типом int. В результате z интерпретируется, как адрес, по которому лежит строка и происходит ошибка сегментирования.
Прототип функции strcat():
char *strcat(char *dest, const char *src);
ни на какие мысли не наводит? :)