53 / 53 / 37
Регистрация: 20.11.2011
Сообщений: 243
Записей в блоге: 1
1

std::string::find и кириллица

25.08.2013, 21:54. Показов 16185. Ответов 28
Метки нет (Все метки)

есть простенький код
C++
1
2
3
4
5
6
7
8
9
#include <iostream>       // std::cout
#include <string>         // std::string
 
int main ()
{
    std::string str = "привет";
    std::cout << str.find("ве");
    return 0;
}
если в str содержится кириллица, то find работает как попало, выдаёт неверный результат.
с английскими буквами всё нормально. как бороться с этим, позарез нужен метод find, помогите пожалуйста!
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
25.08.2013, 21:54
Ответы с готовыми решениями:

Почему std::string::find не находит подстроку?
Вот: std::string str = &quot;01234567890&quot;; int p = str.find(&quot;23&quot;, 0, 5); std::cout &lt;&lt; p;...

Как работает функция std::string::find(...)
здравствуйте есть допустим вот такой код #include &lt;iostream&gt; #include &lt;string&gt; using namespace...

ошибка error: cannot convert 'std::string {aka std::basic_string<char>}' to 'std::string* {aka std::basic_stri
на вод поступают 2 строки типа string. определить количество вхождений строки 2 в строку 1 ошибка...

Запрошено преобразование от ‘const std::string*’ к нескалярному типу ‘std::string’
private: std::string firstName; }; std::string ClientData::getFirstName() const{ ...

28
5488 / 4883 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
25.08.2013, 21:56 2
В начале main():
C++
1
setlocale(LC_ALL, "RUS");
0
53 / 53 / 37
Регистрация: 20.11.2011
Сообщений: 243
Записей в блоге: 1
25.08.2013, 22:01  [ТС] 3
Пробовал, не взлетело.
Bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
bernhardt@NP355V4C:~$ locale
LANG=ru_RU.UTF-8
LANGUAGE=
LC_CTYPE="ru_RU.UTF-8"
LC_NUMERIC="ru_RU.UTF-8"
LC_TIME="ru_RU.UTF-8"
LC_COLLATE="ru_RU.UTF-8"
LC_MONETARY="ru_RU.UTF-8"
LC_MESSAGES="ru_RU.UTF-8"
LC_PAPER="ru_RU.UTF-8"
LC_NAME="ru_RU.UTF-8"
LC_ADDRESS="ru_RU.UTF-8"
LC_TELEPHONE="ru_RU.UTF-8"
LC_MEASUREMENT="ru_RU.UTF-8"
LC_IDENTIFICATION="ru_RU.UTF-8"
LC_ALL=
0
347 / 292 / 37
Регистрация: 23.03.2012
Сообщений: 838
25.08.2013, 22:03 4
C++
1
wstring
0
53 / 53 / 37
Регистрация: 20.11.2011
Сообщений: 243
Записей в блоге: 1
25.08.2013, 22:10  [ТС] 5
ругается, не компилирует.
C++
1
main.cpp:7:21: error: conversion from ‘const char [13]’ to non-scalar type ‘std::wstring {aka std::basic_string<wchar_t>}’ requested
0
5488 / 4883 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
25.08.2013, 22:13 6
Цитата Сообщение от [WRG] Посмотреть сообщение
Пробовал, не взлетело.
Очень даже взлетело.
Миниатюры
std::string::find и кириллица  
0
55 / 55 / 6
Регистрация: 07.07.2013
Сообщений: 345
25.08.2013, 22:14 7
[WRG], попробуйте в начале main написать
C++
1
2
SetConsoleCP(1251);
SetConsoleOutputCP(1251);
и еще шрифт в самой консоле поменять на Lucida Console
0
160 / 101 / 14
Регистрация: 17.10.2012
Сообщений: 488
25.08.2013, 22:15 8
BigLow, эти функции ставят кодовые страницы консоли, при чем тут string?
0
5488 / 4883 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
25.08.2013, 22:15 9
Цитата Сообщение от [WRG] Посмотреть сообщение
Пробовал, не взлетело.
Среда? ОС?
0
347 / 292 / 37
Регистрация: 23.03.2012
Сообщений: 838
25.08.2013, 22:15 10
Цитата Сообщение от [WRG] Посмотреть сообщение
ругается, не компилирует.
C++
1
main.cpp:7:21: error: conversion from ‘const char [13]’ to non-scalar type ‘std::wstring {aka std::basic_string<wchar_t>}’ requested
C++
1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>
#include <string>
 
int main()
  {
  setlocale(LC_ALL,"");
  std::wstring string(L"привет");
  std::wstring search_string(L"ве");
  std::wcout<<"Position of "<<search_string<<" in "<<string<<" : "<<string.find(search_string)<<std::endl;
  system("pause");
  return 0;
  }
1
53 / 53 / 37
Регистрация: 20.11.2011
Сообщений: 243
Записей в блоге: 1
25.08.2013, 22:16  [ТС] 11
попробуйте с другим словом, может совпало?
у меня не взлетает чего-то...
Миниатюры
std::string::find и кириллица  
0
53 / 53 / 37
Регистрация: 20.11.2011
Сообщений: 243
Записей в блоге: 1
25.08.2013, 22:18  [ТС] 12
Цитата Сообщение от alsav22 Посмотреть сообщение
Среда? ОС?
Debian Linux 7.1
Bash
1
2
3
4
5
bernhardt@NP355V4C:~$ gcc --version
gcc (Debian 4.8.1-9) 4.8.1
Copyright (C) 2013 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
0
5488 / 4883 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
25.08.2013, 22:24 13
С Linux не знаком. Там свои особенности. Может в среде нужно что-то настроить.
0
347 / 292 / 37
Регистрация: 23.03.2012
Сообщений: 838
25.08.2013, 22:24 14
Цитата Сообщение от [WRG] Посмотреть сообщение
попробуйте с другим словом, может совпало?
у меня не взлетает чего-то...
Мой код пробовал?
1
53 / 53 / 37
Регистрация: 20.11.2011
Сообщений: 243
Записей в блоге: 1
25.08.2013, 22:27  [ТС] 15
Цитата Сообщение от Nekto Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>
#include <string>
 
int main()
  {
  setlocale(LC_ALL,"");
  std::wstring string(L"привет");
  std::wstring search_string(L"ве");
  std::wcout<<"Position of "<<search_string<<" in "<<string<<" : "<<string.find(search_string)<<std::endl;
  system("pause");
  return 0;
  }
благодарю, вот это взлетело, без
C++
1
system("pause");
, конечно. в чем тут соль? что за буквы "L", в коде, без них не работает? ну и какие еще могут быть подводные камни при работе c wstring кроме wcout, если писать приходится в основном в файл, а не на экран?
0
347 / 292 / 37
Регистрация: 23.03.2012
Сообщений: 838
25.08.2013, 22:31 16
Цитата Сообщение от [WRG] Посмотреть сообщение
благодарю, вот это взлетело, без
C++
1
system("pause");
, конечно. в чем тут соль? что за буквы "L", в коде, без них не работает? ну и какие еще могут быть подводные камни при работе c wstring кроме wcout, если писать приходится в основном в файл, а не на экран?
Попробуй еще с твоим кодом, только с
C++
1
setlocale(LC_ALL,"");
Мне кажется, что в этом проблема. locale на разных ОС разные. На линуксе судя по всему нету "Russian".
0
53 / 53 / 37
Регистрация: 20.11.2011
Сообщений: 243
Записей в блоге: 1
25.08.2013, 22:36  [ТС] 17
нет, без wstring работать не хочет, даже с
C++
1
setlocale(LC_ALL, "")
Добавлено через 1 минуту
так локаль-то в системе какая положено стоит, по умолчанию
Bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
bernhardt@NP355V4C:~$ locale
LANG=ru_RU.UTF-8
LANGUAGE=
LC_CTYPE="ru_RU.UTF-8"
LC_NUMERIC="ru_RU.UTF-8"
LC_TIME="ru_RU.UTF-8"
LC_COLLATE="ru_RU.UTF-8"
LC_MONETARY="ru_RU.UTF-8"
LC_MESSAGES="ru_RU.UTF-8"
LC_PAPER="ru_RU.UTF-8"
LC_NAME="ru_RU.UTF-8"
LC_ADDRESS="ru_RU.UTF-8"
LC_TELEPHONE="ru_RU.UTF-8"
LC_MEASUREMENT="ru_RU.UTF-8"
LC_IDENTIFICATION="ru_RU.UTF-8"
LC_ALL=
0
347 / 292 / 37
Регистрация: 23.03.2012
Сообщений: 838
25.08.2013, 22:37 18
Цитата Сообщение от [WRG] Посмотреть сообщение
нет, без wstring работать не хочет, даже с
C++
1
setlocale(LC_ALL, "")
Добавлено через 1 минуту
так локаль-то в системе какая положено стоит, по умолчанию
Bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
bernhardt@NP355V4C:~$ locale
LANG=ru_RU.UTF-8
LANGUAGE=
LC_CTYPE="ru_RU.UTF-8"
LC_NUMERIC="ru_RU.UTF-8"
LC_TIME="ru_RU.UTF-8"
LC_COLLATE="ru_RU.UTF-8"
LC_MONETARY="ru_RU.UTF-8"
LC_MESSAGES="ru_RU.UTF-8"
LC_PAPER="ru_RU.UTF-8"
LC_NAME="ru_RU.UTF-8"
LC_ADDRESS="ru_RU.UTF-8"
LC_TELEPHONE="ru_RU.UTF-8"
LC_MEASUREMENT="ru_RU.UTF-8"
LC_IDENTIFICATION="ru_RU.UTF-8"
LC_ALL=
setlocale(LC_ALL,"ru_RU.UTF-8"); а так?
1
53 / 53 / 37
Регистрация: 20.11.2011
Сообщений: 243
Записей в блоге: 1
25.08.2013, 22:39  [ТС] 19
так тоже безрезультатно, пробовал
0
347 / 292 / 37
Регистрация: 23.03.2012
Сообщений: 838
25.08.2013, 22:45 20
http://www.cplusplus.com/reference/string/wstring/ тот же стринг, только хранит в wchar_t . L указывает, что к кавычках не обычные чары
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
25.08.2013, 22:45
Помогаю со студенческими работами здесь

На основе исходного std::vector<std::string> содержащего числа, создать std::vector<int> с этими же числами
подскажите есть вот такая задача. Есть список . Создать второй список, в котором будут все эти же...

Реализация класса MyString. Стандартная библиотека, std::string, std::vector
как добавить реализацию конкатенации строк через перегрузку оператора &quot;+=&quot; в классе MyString и...

Передача функции указатель на элемент std::vector<std::string>
Доброй ночи тем, кому не спится (или живет в другом часовом поясе:p)! Есть функция, требующая в...

Операция std::cout для Объекта типа std::string
Кто детально объяснит почему не выводит ? Дает вот так &quot;Отсутствует оператор &quot;&lt;&lt;&quot;, соответствующий...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru