С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
11 / 11 / 2
Регистрация: 18.01.2010
Сообщений: 53
1

Вопросы по типу char

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

Author24 — интернет-сервис помощи студентам
Читаю книгу Страуструпа. Дошёл до типа 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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
07.03.2012, 17:57
Ответы с готовыми решениями:

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

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

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

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

10
Псевдослучайный
1946 / 1145 / 98
Регистрация: 13.09.2011
Сообщений: 3,215
07.03.2012, 17:59 2
Скорее всего потому, что utf8.
0
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
Делаю внезапно и красиво
Эксперт С++
1313 / 1228 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
07.03.2012, 18:30 4
cout не выводит unicode. Используй wcout.
0
11 / 11 / 2
Регистрация: 18.01.2010
Сообщений: 53
07.03.2012, 18:45  [ТС] 5
Всё равно впадает в бесконечный цикл при вводе символа не из стандартной библиотеки. Где можно почитать, почему так происходит?

Добавлено через 10 минут
С каждой минутой с++ становится всё непонятней и непонятней. Сейчас читаю про int, там написано, что в отличает от char он всегда со знаком. Но если смотреть по программе выше, то и char тоже со знаком... Ничего я в этом C++ не понимаю
0
Жарю без масла
867 / 749 / 225
Регистрация: 13.01.2012
Сообщений: 1,702
07.03.2012, 18:58 6
знаковый или беззнаковый тип char - зависит от реализации
1
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
Жарю без масла
867 / 749 / 225
Регистрация: 13.01.2012
Сообщений: 1,702
07.03.2012, 19:06 8
Цитата Сообщение от hasys Посмотреть сообщение
При вводе символа из расширенной таблицы уходит в бесконечный цикл.
решил воспроизвести у себя. как не старался не вышло бесконечного цикла.
напишите, что вводите
0
Higher
1953 / 1219 / 120
Регистрация: 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
Псевдослучайный
1946 / 1145 / 98
Регистрация: 13.09.2011
Сообщений: 3,215
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
11 / 11 / 2
Регистрация: 18.01.2010
Сообщений: 53
07.03.2012, 19:16  [ТС] 11
Всем спасибо, теперь всё работает

решил воспроизвести у себя. как не старался не вышло бесконечного цикла.
напишите, что вводите
Например любую букву кирилицы.
0
07.03.2012, 19:16
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
07.03.2012, 19:16
Помогаю со студенческими работами здесь

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

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

Выражение должно относиться к целочисленному типу или типу перечислений без области видимости
#include &quot;stdafx.h&quot; #include &lt;iostream&gt; using namespace std; class lVector { int Vector1;...

Выражение должно относиться к целочисленному типу или типу перечисления без области видимости
#include &quot;pch.h&quot; #include &lt;iostream&gt; #include &lt;conio.h&gt; #include &lt;string&gt; #include &lt;fstream&gt; ...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru