Почему добавляется лишний символ в массив?
после 
for (; *t != '\0'; t++)
      *s++ = *t;
добавьте 
*s = '\0'

чтобы строчку завершить

но вообще у вас переполнение буфера идёт, за рамки массива вылезаете при копировании. Обратите на это внимание и выделяйте память динамически.
Вы не копируете '\0' на конце. Поэтому после приписывания идет мусор. И так получается, что у вас в памяти там мусор "v\0".

Вторая проблема, вы пишите в строку s, не меняя ее размер.
char s[] = "abc"; выделяет ровно столько памяти, сколько нужно для "abc", да еще и на стеке, раз у вас переменные локальные.

Вы при дописывании чего-то к строке затираете другие переменные. Так у вас совпало, что после name идет surname на стеке. Поэтому вы переписываете память второй строки (но без первого символа, который занял место '\0' в name. Именно поэтому мусор в конце - это неперезаписанный конец surname "v\0". Если поменять местами переменные, то вы может стек перепишите и у вас программа вообще упадет.

Вам надо строки выделять с запасом: char name[1000] = "Ivan";