Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.88/8: Рейтинг темы: голосов - 8, средняя оценка - 4.88
24 / 4 / 0
Регистрация: 16.03.2013
Сообщений: 62

Получение символа строки (Debian)

10.02.2015, 19:53. Показов 1685. Ответов 22
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте! Столкнулся с проблемой: когда пытаюсь вернуть n-ый символ строки, получаю
Bash
1
2
./test.out
� -128
(тут символ- знак вопроса в шестиугольнике)
При этом, если переменная text записана латинскими символами, то возвращает нужную букву и её код. В чём может быть загвоздка?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
#include <string>
using namespace std;
int main()
{
    
    setlocale(LC_ALL,".1251");//Делаем допустимым вывод кириллицы в консоль.
 
    string text = "русский";
    char a = text[1];
    int b = (int) (a);
    cout<<a<<" "<<b<<endl;
return 0;
}
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
10.02.2015, 19:53
Ответы с готовыми решениями:

Функции для работы со строками - получение символа строки
Всем доброго времени суток! Начал изучать C++ пару дней назад, а так как я знаком с PHP, его изучение пошло как по маслу. Но...

Как скопировать подстроку из строки до определенного символа? Или удалить, начиная с этого символа
Добрый вечер. Ответ искал, но не нашёл. Предположим, есть строка: ABC|DEF Надо скопировать всё до | , т.е., в приведённом...

Получение кода символа
Уважаемые Форумчанине) я создал эту темя для того, что бы по мере прохождения книги по С++, я мог задавать здесь вопросы которые меня...

22
Модератор
Эксперт С++
 Аватар для zss
13773 / 10966 / 6491
Регистрация: 18.12.2011
Сообщений: 29,244
10.02.2015, 20:02
char знаковая переменная, все что больше 127 - отрицательное.
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
10.02.2015, 20:17
Цитата Сообщение от Evilor Посмотреть сообщение
В чём может быть загвоздка?
В utf-8 1 символ не обязательно занимает 1 байт (может быть от 1 до 6). В частности, русские символы будут занимать 2 байта. Поэтому так просто индексация не будет работать. Базовая латиница в юникоде имеет те же коды (и в utf-8 занимает 1 байт на символ), что и в таблице ASCII, поэтому ты видишь их код при таком доступе.
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
10.02.2015, 20:24
А не в utf-8 ли будет этот text?
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
10.02.2015, 20:30
Цитата Сообщение от nmcf Посмотреть сообщение
А не в utf-8 ли будет этот text?
В нем, родимом.
0
24 / 4 / 0
Регистрация: 16.03.2013
Сообщений: 62
10.02.2015, 21:27  [ТС]
DrOffset, это значит, консоль неким образом нужно перевести в режим работы с utf-8, а так же вместо char брать другой тип?
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
10.02.2015, 21:32
Цитата Сообщение от Evilor Посмотреть сообщение
это значит, консоль неким образом нужно перевести в режим работы с utf-8, а так же вместо char брать другой тип?
Зачем? Она и так в Utf-8. Просто ты взял кусок символа и вывел его. Символ состоит из двух байт, а ты вывел только один.
Вот, ознакомься с этой темой.
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
10.02.2015, 21:52
Используй wchar_t, wstring и wcin/wcout. Тогда можно [] использовать.
0
24 / 4 / 0
Регистрация: 16.03.2013
Сообщений: 62
11.02.2015, 16:52  [ТС]
DrOffset, насколько понял, нужно обратиться к библиотеке UTF8-CPP и построить по примеру этого поста? Но не совсем понял как получить конкретно символ.
0
267 / 170 / 40
Регистрация: 25.08.2014
Сообщений: 1,087
Записей в блоге: 1
11.02.2015, 17:11
Посмотри что у тебя по факту инициализирует text.
0
24 / 4 / 0
Регистрация: 16.03.2013
Сообщений: 62
11.02.2015, 18:20  [ТС]
Enno, текст? Но так или иначе проблема остаётся в кодировке, как и сказал DrOffset
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
11.02.2015, 18:25
Цитата Сообщение от Evilor Посмотреть сообщение
Но не совсем понял как получить конкретно символ.
В utf-8 конкретно символ, как цельную сущность, ты не получишь. Но можно преобразовать его в utf-32, опять же средствами библиотеки той. Вот тут есть пример.
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
11.02.2015, 19:01
Зачем преобразовывать, если можно сразу wstring использовать?
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
11.02.2015, 19:29
Цитата Сообщение от nmcf Посмотреть сообщение
Зачем преобразовывать, если можно сразу wstring использовать?
Зависит от того, что нужно ТС. В каких-то задачах проще.
А если так вопрос ставить, то я бы сказал, что получение конкретного символа по индексу почти никогда не нужно в реальности, следовательно, в реальности нет необходимости во всех этих извращениях. Но я этого не говорю, потому что не знаю задачу ТС.
0
24 / 4 / 0
Регистрация: 16.03.2013
Сообщений: 62
11.02.2015, 19:52  [ТС]
Цитата Сообщение от DrOffset Посмотреть сообщение
Но я этого не говорю, потому что не знаю задачу ТС.
Вообще, я просто изучаю С++, стараюсь понять что и как. В общем, вполне успешно.
В целом, хочу сделать программу которая текстовую строку на входе, разделённую пробелами разбивает по словам и пишет в вектор
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
11.02.2015, 21:01
Уже не первый случай, когда люди упорно пытаются обращаться по индексу к utf-8 строке, не смотря на все объяснения про wchar_t и wstring. Да, есть библиотеки, но зачем усложнять?
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
11.02.2015, 21:51
Лучший ответ Сообщение было отмечено Evilor как решение

Решение

Цитата Сообщение от Evilor Посмотреть сообщение
хочу сделать программу которая текстовую строку на входе, разделённую пробелами разбивает по словам и пишет в вектор
Ну вот я и говорю, индексы и отдельные символы для этой задачи не нужны.
Вот пример:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#include <iostream>
#include <string>
#include <vector>
 
void split_to_vector(std::string const & str
                   , std::vector<std::string> & tokens
                   , std::string const & delim = " ")
{
    size_t pos, lastPos = 0;
 
    while((pos = str.find(delim, lastPos)) != std::string::npos)
    {
       if(pos != lastPos)
       {
           tokens.push_back(std::string(str.data() + lastPos, pos - lastPos));
       }
       lastPos = pos + delim.size();
    }
    if(lastPos != str.size())
    {
        tokens.push_back(std::string(str.data() + lastPos));
    }
}
 
int main()
{
    std::vector<std::string> vec;
    split_to_vector("      это строка            для проверки       ", vec, " ");
 
    for(auto const & v : vec)
    {
        std::cout << '[' << v << ']' << '\n';
    }
}
http://rextester.com/PFS32238
1
24 / 4 / 0
Регистрация: 16.03.2013
Сообщений: 62
13.02.2015, 07:19  [ТС]
DrOffset, мне стоило сразу ставить вопрос именно таким образом. Большое спасибо

Добавлено через 18 часов 30 минут
DrOffset, программа не работает, что странно. Вот исправил немного код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#include <iostream>
#include <string>
#include <vector>
using namespace std; 
void split_to_vector(string const & str
                   , vector<string> & tokens
                   , string const & delim = " ")
{
    size_t pos, lastPos = 0;
 
    while((pos = str.find(delim, lastPos)) != std::string::npos)
    {
       if(pos != lastPos)
       {
           tokens.push_back(std::string(str.data() + lastPos, pos - lastPos));
       }
       lastPos = pos + delim.size();
    }
    if(lastPos != str.size())
    {
        tokens.push_back(std::string(str.data() + lastPos));
    }
}
 
int main()
{   setlocale(LC_ALL,".1251");
    string txt;
    cin >> txt;
    vector<string> vec;
    split_to_vector(txt, vec, " ");
 
        cout << '[' << vec[2] << ']'<<  '\n';
 
}
Компилирую, запускаю, ввожу строку и получаю:
Bash
1
2
3
 ./test.out
некий очень странный текст
Ошибка сегментирования
Что может быть не так?
0
What a waste!
 Аватар для gray_fox
1610 / 1302 / 180
Регистрация: 21.04.2012
Сообщений: 2,733
13.02.2015, 07:58
Лучший ответ Сообщение было отмечено Evilor как решение

Решение

Цитата Сообщение от Evilor Посмотреть сообщение
C++
1
cin >> txt;
Так до пробела читает; до перевода строки так
C++
1
getline(cin, txt);
1
24 / 4 / 0
Регистрация: 16.03.2013
Сообщений: 62
13.02.2015, 08:13  [ТС]
gray_fox, большое спасибо!!!!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
13.02.2015, 08:13
Помогаю со студенческими работами здесь

получение символа по коду и назад
есть char a=&quot;A&quot;; какие в с++ есть функции для получения кода символа? т.е. нужно получить код символа который содержится в переменной а и...

Получение второго символа строки
Здравствуйте. Появилась необходимость получения второго символа строки. И вот что из этого получилось: &lt;?php ...

Ввод строки S и символа С. Результат: число повторений символа С и порядковые позиции вхождения этого символа в строку
Нужно составить программу, в которой пользователь вводит вручную строку S и символ C. Результатом программы должно быть число повторений...

Получение символа по юникод-коду символа
Добрый день. Скажите, есть ли Win32 API функция для получения символа по юникод-коду символа? Например есть такой юникод-код символа:...

Debian 7.6 +Nginx отправка и получение почты
Голова кипит, мозги плавятся... пересмотрел 100500 статей и мануалов по настройке отправки и получению почты в Debian. То что то не...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru