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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
hasys
11 / 11 / 2
Регистрация: 18.01.2010
Сообщений: 53
#1

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

07.03.2012, 17:57. Просмотров 909. Ответов 10
Метки нет (Все метки)

Читаю книгу Страуструпа. Дошёл до типа 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 обрабатывает как два символа?
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.03.2012, 17:57
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Вопросы по типу char (C++):

Сделать преобразование unsigned char в char, а затем типу int - C++
Здраствуйте, есть вопрос: Число представлено двумя полями: типа long для рублей и unsigned char - для копеек. Собственно что мне...

Адрес переменной к типу (char*) - C++
Здравствуйте. Для &quot;запоминания&quot; данных переменных можно использовать сериализацию аля: int i = 12; ofstream f(&quot;text.txt&quot;); ...

Как присвоить типу char значение string? - C++
При выполнении строки w.at(1)=l; выдает error2440 cannot convert from std::string to char как перевести l в char или w.at в...

Преобразования массива с типа int к типу char - C++
Помогите решить задачу. Требуется создать шаблон класса для преобразования массива с типа int к типу char, помогите кто чем сможет буду...

Написать шаблон класса очередь, и сделать к типу char спецификацию - C++
по заданию, нужно написать шаблон класса очередь, и сделать к типу char спецификацию, вот тут сообственно и начинаются проблемы, сам шаблон...

Выражение должно относиться к целочисленному типу или типу перечисления без области видимости - C++
#include &lt;iostream&gt; #include &lt;cmath&gt; using namespace std; int main() { int N; double Y = 0; setlocale(0,&quot;&quot;); cout &lt;&lt;...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
NoMasters
Псевдослучайный
1754 / 1097 / 72
Регистрация: 13.09.2011
Сообщений: 3,134
07.03.2012, 17:59 #2
Скорее всего потому, что utf8.
0
hasys
11 / 11 / 2
Регистрация: 18.01.2010
Сообщений: 53
07.03.2012, 18:11  [ТС] #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');
}
При вводе символа из расширенной таблицы уходит в бесконечный цикл. При латинице работает как часы.
0
Deviaphan
Делаю внезапно и красиво
Эксперт C++
1287 / 1221 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
07.03.2012, 18:30 #4
cout не выводит unicode. Используй wcout.
0
hasys
11 / 11 / 2
Регистрация: 18.01.2010
Сообщений: 53
07.03.2012, 18:45  [ТС] #5
Всё равно впадает в бесконечный цикл при вводе символа не из стандартной библиотеки. Где можно почитать, почему так происходит?

Добавлено через 10 минут
С каждой минутой с++ становится всё непонятней и непонятней. Сейчас читаю про int, там написано, что в отличает от char он всегда со знаком. Но если смотреть по программе выше, то и char тоже со знаком... Ничего я в этом C++ не понимаю
0
retmas
Жарю без масла
859 / 741 / 164
Регистрация: 13.01.2012
Сообщений: 1,694
07.03.2012, 18:58 #6
знаковый или беззнаковый тип char - зависит от реализации
1
hasys
11 / 11 / 2
Регистрация: 18.01.2010
Сообщений: 53
07.03.2012, 19:04  [ТС] #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.
0
retmas
Жарю без масла
859 / 741 / 164
Регистрация: 13.01.2012
Сообщений: 1,694
07.03.2012, 19:06 #8
Цитата Сообщение от hasys Посмотреть сообщение
При вводе символа из расширенной таблицы уходит в бесконечный цикл.
решил воспроизвести у себя. как не старался не вышло бесконечного цикла.
напишите, что вводите
0
diagon
Higher
1929 / 1195 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
07.03.2012, 19:09 #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()
И все заработает.
1
NoMasters
Псевдослучайный
1754 / 1097 / 72
Регистрация: 13.09.2011
Сообщений: 3,134
07.03.2012, 19:11 #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

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

решил воспроизвести у себя. как не старался не вышло бесконечного цикла.
напишите, что вводите
Например любую букву кирилицы.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.03.2012, 19:16
Привет! Вот еще темы с ответами:

Выражение должно относиться к целочисленному типу или типу перечисления без области видимости - C++
Добрый день,столкнулся с проблемой &quot;Выражение должно относиться к целочисленному типу или типу перечисления без области видимости&quot; в такой...

2IntelliSense: выражение должно относиться к целочисленному типу или типу перечисления без области видимости - C++
&quot;Выражение должно относиться к целочисленному типу или типу перечисления без области видимости&quot; Что это за ошибка такая и как ее исправить?...

что происходит со старым конструктором когда я создаю новый, пренадлежащий производному типу? (первый конструктор пренадлежит базовому типу) - C++
1) что происходит со старым конструктором когда я создаю новый, пренадлежащий производному классу? (первый конструктор пренадлежит базовому...

(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const& - C++
astxx::manager::connection::connection(std::basic_string&lt;char, std::char_traits&lt;char&gt;, std::allocator&lt;char&gt; &gt; const&amp;, unsigned short); ...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
07.03.2012, 19:16
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru