Читать невозможно, линии слишком длинные, учитесь писать не шире 80 символов, это широко принятый стандарт.
В replace_first_digit
можно было бы обойтись без дополнительной перменной, она
делает код длиннее. Двойные неравенства лучше оформлять следующим образом:
'0' <= *p && *p <= '9'