Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Код не компилируется для русскоязычной версии, не компилируется код с русскими символам 
V
    Опции темы
Compositum
Дата 25.12.2011, 16:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Senior developer
**


Профиль
Группа: Awaiting Authorisation
Сообщений: 430
Регистрация: 6.1.2008
Где: Санкт-Петербург

Репутация: нет
Всего: 1



Добрый день. В свободное время потихоньку изучаю Си (не C++, а именно C - для форматирования кода использую вариант "C++", т.к. в предлагаемом списке отсутствует вариант "C").
Код на C (стандарт C89).
Показываю две версии: "английскую" и "русскую".

"Английская версия":
Код

#include<stdio.h>
#include<ctype.h>
#include<stdlib.h>
//***fields***
//int marks [][5];
//***

int main(void){
    char c;
    int i;
    for(;;){
        do{
            printf("(I)nput of marks for students\n");
            printf("(G)et the marks of students\n");
            printf("E(x)it from program\n");
            printf("Your selection: ");
            c = (char) getchar();
            c = tolower(c);    
            printf("%c\n", c);            
            i = (c != 'i' && c != 'g' && c != 'x');
            i ? printf("Недопустимый ввод\n") : printf("Ввод принят...\n");
        }while(i);

        switch(c){
            case 'i':
                //...
                break;
            case 'g':
                //...
                break;
            case 'x':
                exit(0);
                break;
        }
    }
    return 0;
}

"Английская" версия компилируется без проблем и работает.

"Русская" версия:
Код

#include<stdio.h>
#include<ctype.h>
#include<stdlib.h>
//***fields***
//int marks [][5];
//***

int main(void){
    char c;
    int i;
    for(;;){
        do{
            printf("В(в)вод оценок студентов\n");
            printf("В(ы)вод оценок студентов\n");
            printf("Вы(х)од из программы\n");
            printf("Ваш выбор: ");            
            c = (char) getchar();
            c = tolower(c);    
            printf("%c\n", c);            
            i = (c != 'в' && c != 'ы' && c != 'х');            
            i ? printf("Недопустимый ввод\n") : printf("Ввод принят...\n");
        }while(i);

        switch(c){
            case 'в':
                //...
                break;
            case 'ы':
                //...
                break;
            case 'х':
                exit(0);
                break;
        }
    }
    return 0;
}


"Русская" версия не компилируется, пишет:

Цитата

bush@bush-VComp ~/Документы $ gcc 3-1.c 
3-1.c: В функции «main»:
3-1.c:20:14: предупреждение: многознаковая символьная константа [-Wmultichar]
3-1.c:20:27: предупреждение: многознаковая символьная константа [-Wmultichar]
3-1.c:20:40: предупреждение: многознаковая символьная константа [-Wmultichar]
3-1.c:25:9: предупреждение: многознаковая символьная константа [-Wmultichar]
3-1.c:25:4: предупреждение: значение с больше чем максимальное значение данного типа [по умолчанию включена]
3-1.c:28:9: предупреждение: многознаковая символьная константа [-Wmultichar]
3-1.c:28:4: предупреждение: значение с больше чем максимальное значение данного типа [по умолчанию включена]
3-1.c:31:9: предупреждение: многознаковая символьная константа [-Wmultichar]
3-1.c:31:4: предупреждение: значение с больше чем максимальное значение данного типа [по умолчанию включена]
bush@bush-VComp ~/Документы $ 


Приведённая мною выше "русская" версия, взята из книги Герберта Шилдта "Полный справочник по C", 4-е издание. Там в примере так же русские символы. Об указанной мною выше проблеме ни слова не написано... Видимо переводчик перевёл, а на работоспособность код проверен не был.

Что нужно сделать, чтобы заработал и "русский" вариант?

Спасибо.
PM   Вверх
boostcoder
Дата 25.12.2011, 16:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 20
Всего: 110



русский исходник сохрани в кодировке cp1251 или utf8
PM WWW   Вверх
Compositum
Дата 25.12.2011, 16:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Senior developer
**


Профиль
Группа: Awaiting Authorisation
Сообщений: 430
Регистрация: 6.1.2008
Где: Санкт-Петербург

Репутация: нет
Всего: 1



Цитата(boostcoder @ 25.12.2011,  16:19)
русский исходник сохрани в кодировке cp1251 или utf8

у меня файл и так сохранён в UTF-8.
PM   Вверх
actuator
Дата 25.12.2011, 18:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 44
Регистрация: 15.12.2011

Репутация: нет
Всего: 3



-Wmultichar
PM MAIL   Вверх
Compositum
Дата 25.12.2011, 18:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Senior developer
**


Профиль
Группа: Awaiting Authorisation
Сообщений: 430
Регистрация: 6.1.2008
Где: Санкт-Петербург

Репутация: нет
Всего: 1



Цитата(actuator @ 25.12.2011,  18:00)
-Wmultichar

?
     
PM   Вверх
actuator
Дата 26.12.2011, 03:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 44
Регистрация: 15.12.2011

Репутация: нет
Всего: 3



GCC не будет работать с многобайтовыми строками (а UTF - многобайтовые), пока ты ему это прямо не укажешь предложенным аргументом. Пока не умеешь работать с ними, пиши такие программки в однобайтовой кодировке, которую примет твоя консоль - cp866 (win) или koi-8 (freebsd).
PM MAIL   Вверх
Compositum
Дата 26.12.2011, 09:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Senior developer
**


Профиль
Группа: Awaiting Authorisation
Сообщений: 430
Регистрация: 6.1.2008
Где: Санкт-Петербург

Репутация: нет
Всего: 1



Благодарю за ответы!

Я переписал код, используя вместо char тип wctype_t (добавил нужные include, ну и имена вызывающих функций соответственно подправил). Откомпилировал с указанием опции '-w'. Компиляция прошла успешно, программка отработала. Но у меня возникли др. вопросы по теме:
  • В коде строка типа "привет мир!" воспринимается как массив char (согласно C89/C99). Т.е. для того, чтобы эта строка воспринималась как массив двухбайтных символов, всегда придётся вызывать метод, который будет возвращать указатель на результат преобразования?
  • case 's' : - в данном случае 's' трактуется как char, а case 'ы' : - распознаётся как двухбайтовый символ. Т.е. выходит, что если я работаю с кирилицей, то единственный вариант для меня - предварительно создавать константу const wctype_t, назначать ей значение и в case указывать уже её имя?

Просто получается, что для того, чтобы работать с Unicode нужно постоянно заморачиваться с преобразованием char в wctype_t, т.е. по умолчанию "мама" воспринимается как массив char, а 's' - как char. А хотелось бы, чтобы было наоборот: чтобы "мама" воспринимается как массив wctype_t, а 's' - как wctype_t. Ну а при необходимости всегда можно преобразовать wctype_t в char (просто wctype_t при написании локализованных приложений используется гораздо чаще, чем char).

Спасибо.

Это сообщение отредактировал(а) Compositum - 26.12.2011, 09:44
PM   Вверх
Compositum
Дата 26.12.2011, 11:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Senior developer
**


Профиль
Группа: Awaiting Authorisation
Сообщений: 430
Регистрация: 6.1.2008
Где: Санкт-Петербург

Репутация: нет
Всего: 1



Всё оказалось просто:

1. L"Hello World" - массив двухбайтных символов.
2. L's' - двухбайтный символ

 smile 
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0726 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.