Bạn đã hiểu sai về cách làm việc với chuỗi và hàm fgets của C rồi. Biến Name chứa địa chỉ bắt đầu của chuỗi, không phải ký tự (*Name mới là ký tự tại địa chỉ đó). Mà địa chỉ của Name luôn không bằng với ký tự " " nên nó lặp mãi mãi.
Hàm char *fgets(char *s, int size, FILE *stream) sẽ đọc với số ký tự trong stream nhỏ hơn hoặc bằng size rồi lưu trữ tất cả ký tự đọc được vào buffer s và thêm ký tự NULL vào cuối chuỗi. Khi bạn dùng với stdin thì nó sẽ đọc luôn ký tự newline (khi bạn ấn enter kết thúc nhập chuỗi).
Nếu bài tập không yêu cầu phải đúng thứ tự của các tên nhập vào thì bạn dùng vòng lặp for để tiến lùi là được.
Có thể sửa lại thành:
char *buffer, *str;
buffer = (char *) malloc(1000);
str = (char *) malloc(1000);
printf("Enter string: ");
do {
fgets(buffer, 10, stdin);
strcat(str, buffer);
} while (buffer[strlen(buffer) - 1] != '\n');
// bỏ đi ký tự newline ở cuối chuỗi
str[strlen(str) - 1] = '\0';
// đến đây là việc của bạn rồi :))
printf("\nYou've entered: '%s' - %d\n", name, strlen(name));