Как сказал jwdonahue, проблема в вашем определении name
. char name[20]
создает массив из 20 char
с, а не из 20 строк.
Когда вы запускаете while(ch!=EOF)
l oop, что происходит? В первый раз вы находите адрес 0-го элемента в name
и пишете Andrew
, поэтому name
имеет ['A', 'n', 'd', 'r', 'e', 'w', '\0', '\0', '\0', '\0']
(\0
- это конец строки). Во второй раз вы найдете адрес 1-го элемента в name
и напишите Billboy
, но 0-й элемент все еще там и не изменился, так что вы получите содержимое ['A', 'B', 'i', 'l', 'l', 'b', 'o', 'y', '\0', '\0']
. Добавление Hill
ко второй позиции приводит к ['A', 'B', 'H', 'i', 'l', 'l', '\0', 'y', '\0', '\0']
. Затем, наконец, добавление Mill
дает массив ['A', 'B', 'H', 'M', 'i', 'l', 'l', '\0', '\0', '\0']
.
Когда вы затем go сортируете баллы, вы сортируете символы в этом массиве, которые заканчиваются на ['B', 'H', 'A', 'M', 'i', 'l', 'l', '\0', '\0', '\0']
(ваша сортировка будет влиять только на первые четыре символа). В своем выражении печати вы затем печатаете массив символов, начиная с 0-й, 1-й, 2-й и 3-й позиций соответственно, так что вы получите BHAMill
, HAMill
, AMill
и Mill
.
Надеемся, что должно помочь вам достаточно, чтобы вы отклеились. :)