С наступающим Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.59/37: Рейтинг темы: голосов - 37, средняя оценка - 4.59
vendeme
31 / 3 / 0
Регистрация: 22.06.2011
Сообщений: 88
1

[STL] Работа со std::string

24.08.2012, 17:47. Просмотров 6784. Ответов 52
Метки нет (Все метки)

Привет, форум.

Подскажите, как можно грамотно скопировать "слово" из строки, с указанием начала и конца позиций.
Например:
C++
1
2
string str = "My name is Vendetta";
string str name;
нужно грамотно, методом STL, скопировать буквы с 12 по 19. То-есть, слово Vendetta присвоить к name.
Заранее спасибо, может чуть позже ещё будут вопросы на эту тему.
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.08.2012, 17:47
Ответы с готовыми решениями:

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

STL std::set, std::pair, std::make_pair
Я не знаю как описать тему в двух словах, поэтому не обращайте внимание на...

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

Стандартный поток и STL (std::copy to std::cout)
#include &lt;iostream&gt; #include &lt;sstream&gt; #include &lt;algorithm&gt; #include...

Работа с классом std::string
Доброго времени суток! Помогите, пожалуйста, с задачей! Никак решить не могу!=(...

52
Andsteadur
153 / 137 / 34
Регистрация: 23.05.2009
Сообщений: 275
24.08.2012, 17:53 2
C++
1
2
string str = "My name is Vendetta";
string name = str.substr(11, 8);
1
Пaтрик
427 / 395 / 132
Регистрация: 21.01.2012
Сообщений: 974
Завершенные тесты: 1
24.08.2012, 17:55 3
C++
1
2
3
4
5
6
7
8
9
#include <iostream>
#include <string>
 
int main()
{
    std::string str = "My name is Vendetta";
    str = str.substr(11, 8);
    std::cout << str << std::endl;
}
1
vendeme
31 / 3 / 0
Регистрация: 22.06.2011
Сообщений: 88
24.08.2012, 22:54  [ТС] 4
А как тоже с алгоритмом STL заменить слово с указанием позиций?
например:

C++
1
2
3
std::string str = "My name is Vendetta";
// дальше буквы с 12 по 19 заменить пробелом (не нужно менять размер)
// в итоге:  "My name is         ";
0
OhMyGodSoLong
~ Эврика! ~
1247 / 996 / 74
Регистрация: 24.07.2012
Сообщений: 2,002
24.08.2012, 23:04 5
Использовать нужный вариант replace же.
C++
1
2
3
4
5
6
7
8
9
10
#include <string>
#include <iostream>
 
int main()
{
  std::string str = "My name is Vendetta";
  std::cout << "\"" << str << "\"" << std::endl;
  str.replace(11, 8, 8, ' ');
  std::cout << "\"" << str << "\"" << std::endl;
}
1
vendeme
31 / 3 / 0
Регистрация: 22.06.2011
Сообщений: 88
24.08.2012, 23:12  [ТС] 6
Понятно, а как искать в строке слово, игнорируя указанные символы?

Например:
C++
1
2
3
4
5
6
7
string str =  "M$y #na$me #is $#V#$en$#d$e$#$tt#$a$#$";
string findStr = "Vendetta";
string ignoreStr = "#$";
 
// но искать findStr игнорируя ignoreStr 
if(str.find(findStr) != std::string::npos) ...
// если нашли
0
gray_fox
What a waste!
1554 / 1259 / 166
Регистрация: 21.04.2012
Сообщений: 2,636
Завершенные тесты: 3
24.08.2012, 23:33 7
Можно так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
#include <string>
#include <algorithm>
 
#include <boost/algorithm/string.hpp>
 
 
int main() {
   std::string const str =  "M$y #na$me #is $#V#$en$#d$e$#$tt#$a$#$";
   std::string const findStr = "Vendetta";
   std::string const ignoreStr = "#$";
   
   std::string copy(str);
   copy.erase(std::remove_if(copy.begin(), copy.end(), boost::is_any_of(ignoreStr)), copy.end());
   if (copy.find(findStr) != std::string::npos) {
      // ...
   }
}
1
OhMyGodSoLong
~ Эврика! ~
1247 / 996 / 74
Регистрация: 24.07.2012
Сообщений: 2,002
24.08.2012, 23:33 8
Боюсь, это уже сильно круто для одной функции. Я не особо круто знаю STL, даю 30% что там есть filter или что-то подобное обобщённое. Можно сделать так:
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
#include <iostream>
#include <string>
 
std::string filter(const std::string &str, const std::string &chars)
{
  std::string result;
  for (std::string::const_iterator i = str.begin(); i != str.end(); ++i) {
    if (chars.find(*i) == std::string::npos) {
      result.append(1, *i);
    }
  }
  return result;
}
 
int main()
{
  std::string str =  "M$y #na$me #is $#V#$en$#d$e$#$tt#$a$#$";
  std::string findStr = "Vendetta";
  std::string ignoreStr = "#$";
  
  if (filter(str, ignoreStr).find(findStr) !=  std::string::npos) {
    std::cout << "found";
  }
  else {
    std::cout << "not found";
  }
}
1
vendeme
31 / 3 / 0
Регистрация: 22.06.2011
Сообщений: 88
24.08.2012, 23:41  [ТС] 9
Благодарю, просто интересно методы опытных, как решают некоторые задачи.
Ещё вопрос про find. find возвращает начальную позицию найденного слова, а как узнать конечную позицию?
0
OhMyGodSoLong
~ Эврика! ~
1247 / 996 / 74
Регистрация: 24.07.2012
Сообщений: 2,002
24.08.2012, 23:42 10
rfind ищет с конца.
1
vendeme
31 / 3 / 0
Регистрация: 22.06.2011
Сообщений: 88
24.08.2012, 23:44  [ТС] 11
например:
C++
1
2
string str = "My name is Vendetta. Blah blah";
string::size_type n = str.find("Vendetta");
как узнать конечную позицию?
0
gray_fox
What a waste!
1554 / 1259 / 166
Регистрация: 21.04.2012
Сообщений: 2,636
Завершенные тесты: 3
24.08.2012, 23:47 12
Цитата Сообщение от vendeme Посмотреть сообщение
например:
Код C++
1
2
string str = "My name is Vendetta. Blah blah";
string::size_type n = str.find("Vendetta");
как узнать конечную позицию?
C++
1
2
std::string search = "Vendetta";
std::string::size_type n = str.find(search) + search.length();   // # следующего за последним
1
vendeme
31 / 3 / 0
Регистрация: 22.06.2011
Сообщений: 88
24.08.2012, 23:59  [ТС] 13
Цитата Сообщение от ~OhMyGodSoLong~ Посмотреть сообщение
Боюсь, это уже сильно круто для одной функции. Я не особо круто знаю STL, даю 30% что там есть filter или что-то подобное обобщённое. Можно сделать так:
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
#include <iostream>
#include <string>
 
std::string filter(const std::string &str, const std::string &chars)
{
  std::string result;
  for (std::string::const_iterator i = str.begin(); i != str.end(); ++i) {
    if (chars.find(*i) == std::string::npos) {
      result.append(1, *i);
    }
  }
  return result;
}
 
int main()
{
  std::string str =  "M$y #na$me #is $#V#$en$#d$e$#$tt#$a$#$";
  std::string findStr = "Vendetta";
  std::string ignoreStr = "#$";
  
  if (filter(str, ignoreStr).find(findStr) !=  std::string::npos) {
    std::cout << "found";
  }
  else {
    std::cout << "not found";
  }
}
А можно метод, без изменения размера строки? Допустим я потом хочу заполучить оригинальные позиций нахождения букв findStr?
И всё таки хотелось бы более STL варианта
0
rangerx
1944 / 1553 / 478
Регистрация: 31.05.2009
Сообщений: 2,913
25.08.2012, 00:08 14
Цитата Сообщение от vendeme Посмотреть сообщение
Понятно, а как искать в строке слово, игнорируя указанные символы?
Почитайте про регулярные выражения.
0
OhMyGodSoLong
~ Эврика! ~
1247 / 996 / 74
Регистрация: 24.07.2012
Сообщений: 2,002
25.08.2012, 00:26 15
Цитата Сообщение от vendeme Посмотреть сообщение
А можно метод, без изменения размера строки? Допустим я потом хочу заполучить оригинальные позиций нахождения букв findStr?
И всё таки хотелось бы более STL варианта
Разработчики STL не могут предусмотреть все возможные извращения, к сожалению.
0
vendeme
31 / 3 / 0
Регистрация: 22.06.2011
Сообщений: 88
25.08.2012, 17:32  [ТС] 16
Накипел вопрос с возвращением const char*. Почему я при вызове функций GetSomething() получаю ошибку?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
const char* GetSomething()
{
    vector<string> somes;
    somes.push_back("something");
 
    vector<string>::iterator it = somes.begin();
    return it->c_str();
}
 
int main()
{
    string some = GetSomethig();
    cout << GetSomethig() << endl;
    cin.get(); // pause
}
0
edward_jonson
160 / 160 / 68
Регистрация: 23.02.2011
Сообщений: 392
25.08.2012, 17:38 17
vendeme, Опечатка в мейне. GetSomething()
0
vendeme
31 / 3 / 0
Регистрация: 22.06.2011
Сообщений: 88
25.08.2012, 17:49  [ТС] 18
Цитата Сообщение от edward_jonson Посмотреть сообщение
vendeme, Опечатка в мейне. GetSomething()
не в этом суть, я для форума на скорую руку написал.
Почему экземпляр some вместо "something" получает какие то каракули?
0
MrCold
861 / 759 / 174
Регистрация: 11.01.2012
Сообщений: 1,942
25.08.2012, 17:58 19
Нет ошибки
http://liveworkspace.org/code/25ebd2798e2d028f256b5c39a366d40a
упс пардон не дочитал
0
OhMyGodSoLong
~ Эврика! ~
1247 / 996 / 74
Регистрация: 24.07.2012
Сообщений: 2,002
25.08.2012, 18:01 20
Потому что somes это локальная переменная. c_str() возвращает указатель на строку, хранящуюся в этой локальной переменной. При выходе из функции все локальные переменные удаляются. Соответственно, указатели указывают на мусор.
0
25.08.2012, 18:01
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.08.2012, 18:01

Не правильная работа кода с std::string::empty()
Здравствуйте подскажите в чем проблема? #include &lt;iostream&gt; #include &lt;string&gt;...

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

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


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

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

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