Консольная программа не работает с кириллицей - C (СИ)
Формулировка задачи:
Читаю книгу Кернигана и Ритчи "Язык программирования Си", попутно выполняя задания и пробуя задания из примеров. Переписал find (подобие grep) из главы 5.10 - работает, но не с русскими символами. Например, если ее запустить командой find го, то строку "егор" не найдет. В чем может быть причина. Собственно мой вариант программы:
#include <stdio.h>
#include <string.h>
#define MAXLINE 1000
/* find: вывод строк, содержащих образец из последнего аргумента */
int main(int argc, char *argv[])
{
char line[MAXLINE];
int len;
int found = 0; // Счетчик строк, удовлетворяющих условиям
int lineno = 0; // Счетчик прочитаных строк
int except = 0; // (except) 1 => вывод строк, где нет PATTERN
int number = 0; // (number) 1 => нумеровать строки
int c;
while (--argc > 0 && (*++argv)[0] == '-')
while (c = *++argv[0])
switch (c) {
case 'x':
except = 1;
break;
case 'n':
number = 1;
break;
default:
printf("find: illegal option %c\n", c);
argc = 0;
found = -1;
break;
}
if (argc != 1)
printf("Usage: find [OPTION] [PATTERN]\n"
"\t -x (except) show strings in which there is no PATTERN\n"
"\t -n (number) show the line number");
else
while (fgets(line, MAXLINE, stdin) && strlen(line) > 1) {
lineno++;
if ((strstr(line, *argv) != NULL) != except) {
if (number)
printf("%d: ", lineno);
printf("%s", line);
found++;
}
}
return found;
}Решение задачи: «Консольная программа не работает с кириллицей»
textual
Листинг программы
setlocale(LC_ALL,"RU");
Объяснение кода листинга программы
- Устанавливается локальная настройка для русского языка с помощью функции setlocale().
- В аргументах функции указывается LC_ALL, что означает, что мы хотим установить локаль для всех категорий (всего их может быть до 11).
- В кавычках указывается код локализации, в данном случае
RUдля русского языка.