Форум русскоязычного сообщества Ubuntu


Автор Тема: Вводы-вывод русских букв, язык C  (Прочитано 1081 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн vanadium007

  • Автор темы
  • Новичок
  • *
  • Сообщений: 16
    • Просмотр профиля
Вводы-вывод русских букв, язык C
« : 03 Январь 2020, 18:41:49 »
Доброго времени суток. Некоторое время изучаю программирование на языке Си и столкнулся с ситуацией, что наблюдаю проблемы с вводом-выводом русских букв

Например такая программа:

Код: Text
  1. #include <stdio.h>
  2. #include <locale.h>
  3.  
  4. int main(void) {
  5.     setlocale(LC_ALL, "");
  6.     printf("Введи BIG букву:\n");
  7.     int ch = 0;
  8.     ch = getchar();
  9.     putchar(ch);
  10.     return 0;
  11. }
  12.  
Правильно работает с английскими буквами, но с русскими буквами выводит белый ромбик со знаком вопроса:

Код: HTML5
  1. Введи BIG букву:
  2. Ж

Притом проблем с выводом русских букв написанных в самом тексте программы нет

Но вот такая программа даже без всяких локалей всё выводит правильно:

Код: Text
  1. #include <stdio.h>
  2.  
  3. int main(void) {
  4.     printf("Введи BIG букву:\n");
  5.     int ch[1] = {};
  6.     scanf ("%s", ch);
  7.     printf("%s", ch);
  8.     return 0;
  9. }
  10.  

Код: HTML5
  1. Введи BIG букву:
  2. Ж
  3. Ж

Я не понимаю чем вторая программа концептуально отличается от первой. Казалось бы если неверно работает первая, то и вторая должна работать неверно. А если верно работает вторая то и первая должна работать. Но это не так
« Последнее редактирование: 03 Январь 2020, 19:36:32 от Azure »

Оффлайн Azure

  • Модератор раздела
  • Старожил
  • *
  • Сообщений: 6009
  • Windows10, i3wm on Debian9, Manjaro20.0
    • Просмотр профиля
Re: Вводы-вывод русских букв, язык C
« Ответ #1 : 03 Январь 2020, 19:38:59 »
А если хоть немного задуматься над тем, что кириллическая "буква" - это ДВА символа то все становится понятным.
В Линукс можно сделать ВСЁ что угодно, достаточно знать КАК !

Оффлайн vanadium007

  • Автор темы
  • Новичок
  • *
  • Сообщений: 16
    • Просмотр профиля
Re: Вводы-вывод русских букв, язык C
« Ответ #2 : 03 Январь 2020, 20:46:11 »
Нет, мне не становится. И в первой и во второй программе для хранения символа русской буквы используется тип int, который в четыре раза больше типа char. Но в первом случае программа корректно не работает

Онлайн SergeyIT

  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 4950
  • Все по палатам!
    • Просмотр профиля
Re: Вводы-вывод русских букв, язык C
« Ответ #3 : 03 Январь 2020, 21:11:12 »
vanadium007, в первой вы используете функции работы с символами ввод,
во второй - со строками.
getchar ,берет из ввода 1 байт. Возвращает int - чтобы могла возвратить значение EOF - отличное от кода любого символа.
Первую можно немного поменять, типа
Цитировать
    #include <stdio.h>
    #include <locale.h>
     
    int main(void) {
        setlocale(LC_ALL, "");
        printf("Введи BIG букву:\n");
        int ch1 = 0, ch2 = 0;
        ch1 = getc(stdin);
        ch2 = getchar();
        putchar(ch1);
        if (ch2) putchar(ch2);
        return 0;
    }
чтобы вводила два байта и с русским как-то работать будет, но это просто "костыль" - чтобы вам понятнее было.
Извините, я все еще учусь

Оффлайн vanadium007

  • Автор темы
  • Новичок
  • *
  • Сообщений: 16
    • Просмотр профиля
Re: Вводы-вывод русских букв, язык C
« Ответ #4 : 03 Январь 2020, 21:26:44 »
Я предполагал что getchar и putchar работают именно с int'ами как блоками по четыре байта, а что тогда со scanf и printf со спецификатором %c? Тут уж тем более только с однобайтным типом char

Онлайн SergeyIT

  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 4950
  • Все по палатам!
    • Просмотр профиля
Re: Вводы-вывод русских букв, язык C
« Ответ #5 : 03 Январь 2020, 22:22:27 »
Я предполагал что getchar
В программировании гланое не предполагать, а ЗНАТЬ точно. Один неправильный бит в программе может полностью сделать ее неработающей... а в ОС и всю систему.
Посмотри описание в терминале
man getchar
Извините, я все еще учусь

 

Страница сгенерирована за 0.1 секунд. Запросов: 24.