Форум программистов, компьютерный форум CyberForum.ru

Вопросы по типу char - C++

Восстановить пароль Регистрация
 
hasys
11 / 11 / 2
Регистрация: 18.01.2010
Сообщений: 53
07.03.2012, 17:57     Вопросы по типу char #1
Читаю книгу Страуструпа. Дошёл до типа char. В книге приводится такой пример:

C++
1
2
3
4
5
6
7
#include <iostream>
 
int main(){
    char c;
    std::cin >> c;
    std::cout << "the value of'" << c << "' is " << int(c) << '\n';
}
Чтобы разобраться чуть лучше, я написал вот так:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
using namespace std;
int main(){
    char c;
    signed char sc;
    unsigned char usc;
    wchar_t wc;
    do{
        cin >> c;
        sc = c;
        usc = c;
        wc = c; 
        cout << "the value of '" << c << "' is " << int(c) << '\n';
        cout << "the signed value of '" << c << "' is " << int(sc) << '\n';
        cout << "the unsigned value of '" << c << "' is " << int(usc) << '\n';
        cout << "the wide value of '" << c << "' is " << int(wc) << '\n';
    }while(c != 'q');
}
Запустил программу, получил вот это:

a
the value of 'a' is 97
the signed value of 'a' is 97
the unsigned value of 'a' is 97
the wide value of 'a' is 97
ф
the value of 'С' is -47
the signed value of 'С' is -47
the unsigned value of 'С' is 209
the wide value of 'С' is -47
the value of '„' is -124
the signed value of '„' is -124
the unsigned value of '„' is 132
the wide value of '„' is -124
q
the value of 'q' is 113
the signed value of 'q' is 113
the unsigned value of 'q' is 113
the wide value of 'q' is 113

Методом научного тыка выяснилось, что в c++ char это signed char. Что меня больше интересует, это почему программа, символы из расширенной таблицы ASCII обрабатывает как два символа?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.03.2012, 17:57     Вопросы по типу char
Посмотрите здесь:

что происходит со старым конструктором когда я создаю новый, пренадлежащий производному типу? (первый конструктор пренадлежит базовому типу) C++
error: incompatible types in assignment of 'const char [5]' to 'char [10]' C++
C++ Как присвоить типу char значение string?
C++ Написать шаблон класса очередь, и сделать к типу char спецификацию
C++ Что означает такая запись char *smt=new char[1]?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
NoMasters
Псевдослучайный
1737 / 1080 / 69
Регистрация: 13.09.2011
Сообщений: 3,093
07.03.2012, 17:59     Вопросы по типу char #2
Скорее всего потому, что utf8.
hasys
11 / 11 / 2
Регистрация: 18.01.2010
Сообщений: 53
07.03.2012, 18:11  [ТС]     Вопросы по типу char #3
Написал так:

C++
1
2
3
4
5
6
7
8
9
#include <iostream>
using namespace std;
int main(){
    wchar_t wc;
    do{
        wcin >> wc;
        cout << "the wide value of'" << wc << "' is " << int(wc) << '\n';
    }while((char)wc != 'q');
}
При вводе символа из расширенной таблицы уходит в бесконечный цикл. При латинице работает как часы.
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
07.03.2012, 18:30     Вопросы по типу char #4
cout не выводит unicode. Используй wcout.
hasys
11 / 11 / 2
Регистрация: 18.01.2010
Сообщений: 53
07.03.2012, 18:45  [ТС]     Вопросы по типу char #5
Всё равно впадает в бесконечный цикл при вводе символа не из стандартной библиотеки. Где можно почитать, почему так происходит?

Добавлено через 10 минут
С каждой минутой с++ становится всё непонятней и непонятней. Сейчас читаю про int, там написано, что в отличает от char он всегда со знаком. Но если смотреть по программе выше, то и char тоже со знаком... Ничего я в этом C++ не понимаю
retmas
Жарю без масла
803 / 685 / 143
Регистрация: 13.01.2012
Сообщений: 1,580
07.03.2012, 18:58     Вопросы по типу char #6
знаковый или беззнаковый тип char - зависит от реализации
hasys
11 / 11 / 2
Регистрация: 18.01.2010
Сообщений: 53
07.03.2012, 19:04  [ТС]     Вопросы по типу char #7
Написал так:

C++
1
2
3
4
5
6
7
8
#include <iostream>
using namespace std;
int main(){
    wchar_t wc;
    while(wcin >> wc){
        wcout << "the wide value of'" << wc << "' is " << int(wc) << '\n';
    }
}
Теперь если написать символ из расширенной таблицы - просто выходит из программы. Может быть это критично, не знаю, но я использую Ubuntu GNU/Linux, G++ compiler.
retmas
Жарю без масла
803 / 685 / 143
Регистрация: 13.01.2012
Сообщений: 1,580
07.03.2012, 19:06     Вопросы по типу char #8
Цитата Сообщение от hasys Посмотреть сообщение
При вводе символа из расширенной таблицы уходит в бесконечный цикл.
решил воспроизвести у себя. как не старался не вышло бесконечного цикла.
напишите, что вводите
diagon
Higher
 Аватар для diagon
1920 / 1186 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
07.03.2012, 19:09     Вопросы по типу char #9
Цитата Сообщение от hasys Посмотреть сообщение
Написал так:

C++
1
2
3
4
5
6
7
8
#include <iostream>
using namespace std;
int main(){
    wchar_t wc;
    while(wcin >> wc){
        wcout << "the wide value of'" << wc << "' is " << int(wc) << '\n';
    }
}
Теперь если написать символ из расширенной таблицы - просто выходит из программы. Может быть это критично, не знаю, но я использую Ubuntu GNU/Linux, G++ compiler.
C++
1
2
3
#include <locale>
//...
locale::global( locale("") ); //после int main()
И все заработает.
NoMasters
Псевдослучайный
1737 / 1080 / 69
Регистрация: 13.09.2011
Сообщений: 3,093
07.03.2012, 19:11     Вопросы по типу char #10
C++
1
2
3
4
5
6
7
8
9
10
11
#include <iostream>
#include <cstdlib>
using namespace std;
int main(){
    locale l(getenv("LANG"));
    locale::global(l);
    wchar_t wc;
    while(wcin >> wc){
        wcout << "the wide value of'" << wc << "' is " << int(wc) << '\n';
    }
}
Добавлено через 24 секунды

Не по теме:

so slooooow

MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.03.2012, 19:16     Вопросы по типу char
Еще ссылки по теме:

C++ Выражение должно относиться к целочисленному типу или типу перечисления без области видимости
Преобразования массива с типа int к типу char C++
Преобразование char в char* или разделить на две строки C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
hasys
11 / 11 / 2
Регистрация: 18.01.2010
Сообщений: 53
07.03.2012, 19:16  [ТС]     Вопросы по типу char #11
Всем спасибо, теперь всё работает

решил воспроизвести у себя. как не старался не вышло бесконечного цикла.
напишите, что вводите
Например любую букву кирилицы.
Yandex
Объявления
07.03.2012, 19:16     Вопросы по типу char
Ответ Создать тему
Опции темы

Текущее время: 09:00. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru