Разница между setlocale и SetConsoleCP при работе с русскими символами в консольных приложениях заключается в их функциях и областях применения.
setlocale используется для перекодировки символов в соответствии с требуемым языком. 23 Функция работает только с потоком вывода, не затрагивая то, что пользователь вводит с клавиатуры. 12 Консоль выводит только то, что было прописано в программе заранее, но не введённую вручную строку. 1
SetConsoleCP и его аналог SetConsoleOutputCP позволяют вручную установить нужную кодировку для потоков ввода и вывода. 12 Аргументом для этих функций служит идентификатор кодовой страницы — win-cp 1251. 3 SetConsoleCP используется для установки нужной таблицы на ввод, SetConsoleOutputCP работает непосредственно с выводом. 3
Таким образом, setlocale подходит для решения проблемы с выводом символов, а SetConsoleCP — для работы с вводом и выводом кириллицы в консоли. 13