При вводе имени и фамилии русскими буквами количество символов увеличивается в 2 раза - C (СИ)
Формулировка задачи:
При вводе имени и фамилии английскими буквами все работает нормально.
Но при вводе имени и фамилии русскими буквами количество символов увеличивается в 2 раза.
Например:
Иван Петров
8 12
Компилятор gcc.
#include <stdio.h>
#include <string.h>
int main (){
char name [10];
char surname [10];
int i;
int f;
scanf ("%s", name); //Ввести имя
scanf ("%s", surname); //Ввести фамилию
printf ("%-10s %-10s\n", surname, name); //Вывод по левому краю
i = strlen(name); // Количество символов в имени
f = strlen(surname); // Количество символов в фамилии
printf ("%-10d %-10d\n", f, i); // Вывод количества символов в слове по левому карю
return 0;
}Решение задачи: «При вводе имени и фамилии русскими буквами количество символов увеличивается в 2 раза»
textual
Листинг программы
#include <stdio.h>
#include <locale.h>
#include <time.h>
#include <wchar.h>
int main()
{
setlocale(LC_ALL, "en_US.UTF-8"); // the C locale will be the UTF-8 enabled English
setlocale(LC_NUMERIC, "de_DE"); // decimal dot will be German
setlocale(LC_TIME, "ja_JP"); // date/time formatting will be Japanese
wchar_t str[100];
time_t t = time(NULL);
wcsftime(str, 100, L"%A %c", localtime(&t));
wprintf(L"Number: %.2f\nDate: %Ls\n", 3.14, str);
}
Объяснение кода листинга программы
- #include
Указывает включить в программу файл стандартного ввода/вывода - #include
Указывает включить в программу файл с определениями функций работы с локалью - #include
Указывает включить в программу файл с определениями функций работы со временем - #include
Указывает включить в программу файл с определениями широких символов - int main() Определяет основную функцию программы, с которой начинается выполнение любой программы на C
- setlocale(LC_ALL,
en_US.UTF-8); Устанавливает английскую локаль для всех категорий (LC_ALL) с использованием UTF-8 для обработки широких символов - setlocale(LC_NUMERIC,
de_DE); Устанавливает немецкую локаль для чисел (LC_NUMERIC) - setlocale(LC_TIME,
ja_JP); Устанавливает японскую локаль для даты и времени (LC_TIME) - wchar_t str[100]; Объявляет переменную типа wchar_t с именем str и размером 100 символов
- time_t t = time(NULL); Получает текущее время и сохраняет его в переменной t типа time_t
- wcsftime(str, 100, L
%A %c, localtime(&t)); Форматирует строку str в соответствии с текущим временем, используя формат%A %c, где %A - день недели, %c - день месяца - wprintf(L
Number: %.2f\nDate: %Ls\n, 3.14, str); Выводит отформатированную строку на экран с помощью функции wprintf, где 3.14 - это число, которое необходимо вывести, а str - это отформатированная строка даты