Почему у меня прекращается работа программы в Cи?
Потому что в scanf нужно передавать адрес переменной - &k. Да, и саму переменную инициализируй.
1. Про scanf вам уже сказали.
(т.е. у вас программа не "прекращается", как вы предполагали - она у вас просто аварийно слетает ;-) )
2. Можете переправить:int tmp = start ^ finish;
Так куда понятнее и логичнее, чем какая-то арифметика с вычитаниями.
3. И, если уж развлекаетесь с рекурсией, то логичнее записать так:int tmp = start ^ finish;
hanoi( height - 1, start, tmp );
hanoi( 1, start, finish );
hanoi( height - 1, tmp, finish );