Код выглядит хорошо для меня. Это на самом деле довольно хорошо сделано и читаемо на мой взгляд.
Похоже, вы спрашиваете об оптимизации - не беспокойтесь об оптимизации, пока вы не уверены, что она вам нужна, иначе это просто сделает ваш код менее разборчивым и более подверженным ошибкам. В частности, эта функция будет тратить более 99,99% времени на выполнение, просто ожидая ввода текста пользователем, поэтому ее не нужно оптимизировать.
Я не думаю, что обязательно использовать неудачу для записи как прописных, так и строчных букв в операторе switch, особенно с таким небольшим количеством случаев, как у вас. Это просто немного больше печатать.
Если на самом деле есть проблема с этим кодом, и он не компилируется или не выполняет то, что должен, пожалуйста, опишите проблему.
Редактировать: Единственное, что вы можете изменить, это избавиться от явных падежей для рангов 0-9 и вместо этого объединить их все в один падежный случай с телом:
rank = rank_ch - '0';
Это довольно распространенная идиома C для преобразования числа, хранящегося в виде символа, в целое число, поэтому оно должно быть читаемым для других программистов, которые его читают.