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

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

Войти
Регистрация
Восстановить пароль
 
 
ilyadenisovid
29 / 44 / 8
Регистрация: 20.03.2013
Сообщений: 154
#1

Функции для работы со строками - получение символа строки - C++

02.11.2015, 08:54. Просмотров 1002. Ответов 16
Метки нет (Все метки)

Всем доброго времени суток!

Начал изучать C++ пару дней назад, а так как я знаком с PHP, его изучение пошло как по маслу.

Но возник ряд вопросов, ответы на которые я не получил от Google.

Поэтому обращаюсь к более опытным знатокам дела.

1) Как можно из строки (string) взять символ и использовать его, что-то вроде этого: string str = "Маша"; string symb = str[2]; //ш

2) Можно ли в с++ заменить часть строки в строке на другую строку (по типу функции str_replace в php).
То есть исходная строка: "У меня есть дочь". Работа функции: str_replace(str, "дочь", "сын"). В итоге получается: "У меня есть сын".

3) Можно ли из строки взять другую строку с заданными параметрами, например с 0 по 4 символ. То есть исходная строка: "Семья - это наше всё.". Работа функции: string new_str = our_func(str, 0, 5) - с 0 символа берём 5 знаков. Новая строка - "Семья".

Заранее спасибо.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.11.2015, 08:54
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Функции для работы со строками - получение символа строки (C++):

Нужен пример функции для работы со строками - C++
Какие функции для работы со строками есть. Если не сложно можете привести пример

Только операции и функции для работы с символами, строками и целыми числами - C++
Пусть ЭВМ не умеет работать с вещественными числами, а имеет только операции и функции для работы с символами, строками и целыми числами. ...

Работа со строками (удаление из строки указанного символа) - C++
Недавно начал изучать С++ в универе. Задали написать программу реализующую удаление из строки указанного символа. Программа компилируется,...

Получение символа строки (Debian) - C++
Здравствуйте! Столкнулся с проблемой: когда пытаюсь вернуть n-ый символ строки, получаю ./test.out � -128 (тут символ- знак...

Из строки получить новую, выбросив все вхождения заданного символа (Работа со строками) - C++
Доброго времени суток =) Нужна помощь с заданием: "Из заданной строки получить новую, выбросив из нее все вхождения заданного...

Функции работы со строками, отличие функций с добавлением _s - C++
При работе с строками в VS 2012, увидел от него предупреждение при использовании функций gets(), strcat() и др. Ругается что они являются...

16
nmcf
5535 / 4845 / 1642
Регистрация: 14.04.2014
Сообщений: 19,657
02.11.2015, 09:14 #2
C++
1
2
3
4
5
6
char symb = str[2]; // отдельный символ
string symb = str.substr(2, 1); // строка из одного символа
 
str.replace(str.find("дочь"), 4, "сын"); // при условии, что подстрока присутствует
 
string new_str = str.substr(0, 5);
И учитывай, что string - это древняя строка, а есть wstring.
0
ilyadenisovid
29 / 44 / 8
Регистрация: 20.03.2013
Сообщений: 154
02.11.2015, 09:54  [ТС] #3
Спасибо, сейчас посмотрю, а какие модули нужны для этого?
0
nmcf
5535 / 4845 / 1642
Регистрация: 14.04.2014
Сообщений: 19,657
02.11.2015, 10:05 #4
<string>
0
ilyadenisovid
29 / 44 / 8
Регистрация: 20.03.2013
Сообщений: 154
02.11.2015, 11:06  [ТС] #5
А вот есть еще функция replace_if, как она работает? просто мне нужно, чтобы заменялись все найденные слова, а не только первое.
0
nmcf
5535 / 4845 / 1642
Регистрация: 14.04.2014
Сообщений: 19,657
02.11.2015, 12:01 #6
replace_if() для обработки контейнеров, т. е. работает с символами применительно к string.
Чтобы все слова заменить, нужен либо цикл, либо regex:
C++
1
2
3
  std::string s("string word string point");
  std::regex e("string");
  std::cout << std::regex_replace(s, e, "wstring");
Результат: "wstring word wstring point".
0
ilyadenisovid
29 / 44 / 8
Регистрация: 20.03.2013
Сообщений: 154
02.11.2015, 12:38  [ТС] #7
Спасибо. Но пока решил сам сделать аналог str_replace в php.
Вот что вышло(компилятор ошибок не выдает, но почему-то не работает):
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
string str_replace(string str, string old_str, string new_str) {
    int length_str = sizeof(str) / sizeof(str[0]);
    int length_old_str = sizeof(old_str) / sizeof(old_str[0]);
    if (length_str < length_old_str) return str;
    string result_set = str;
    for (int i = 0; i < length_str; i++) {
        for (int j = 0; j < length_old_str; j++) {
            if (str[i] == old_str[j]) {
                if ((j + 1) == length_old_str) result_set.replace(i, length_old_str, new_str);
            }
            else break;
        }
    }
    return result_set;
}
Подскажите ,если не сложно.

Добавлено через 22 минуты
Ой, там с ошибкой, вот правильное, но не работает почему-то. Компилятор молчит
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
string str_replace(string str, string old_str, string new_str) {
    int length_str = sizeof(str) / sizeof(str[0]);
    int length_old_str = sizeof(old_str) / sizeof(old_str[0]);
    if (length_str < length_old_str) return str;
    string result_set = str;
    for (int i = 0; i < length_str; i++) {
        int start;
        for (int j = 0; j < length_old_str; j++) {
            if (str[i] == old_str[j]) {
                if (old_str[j] == 0) start = str[i];
                if ((j + 1) == length_old_str) result_set.replace(start, length_old_str, new_str);
            }
            else break;
        }
    }
    return result_set;
}
0
Tulosba
:)
Эксперт С++
4397 / 3233 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
02.11.2015, 12:39 #8
Цитата Сообщение от nmcf Посмотреть сообщение
Чтобы все слова заменить, нужен либо цикл, либо regex:
либо контейнер слов, типа vector<string>
0
nmcf
5535 / 4845 / 1642
Регистрация: 14.04.2014
Сообщений: 19,657
02.11.2015, 13:04 #9
Цитата Сообщение от Tulosba Посмотреть сообщение
либо контейнер слов
Ну там вроде бы про целуй строку говорилось.

Добавлено через 1 минуту
Цитата Сообщение от ilyadenisovid Посмотреть сообщение
sizeof(str)
Это что?
Длина строки определяется функцией, это же класс: str.length() или str.size().
0
ilyadenisovid
29 / 44 / 8
Регистрация: 20.03.2013
Сообщений: 154
02.11.2015, 14:00  [ТС] #10
sizeof - это место, занимаемое элементом в памяти
0
Tulosba
:)
Эксперт С++
4397 / 3233 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
02.11.2015, 14:08 #11
Цитата Сообщение от ilyadenisovid Посмотреть сообщение
sizeof - это место, занимаемое элементом в памяти
И ты уверен, что это же число соответствует длине строки?
Проверь:
C++
1
2
std::string s1 = "1234567890";
std::string s2 = "a";
0
ilyadenisovid
29 / 44 / 8
Регистрация: 20.03.2013
Сообщений: 154
02.11.2015, 14:18  [ТС] #12
Да, ошибся. Это только для массивов верно, а здесь не подходит.
0
Tulosba
:)
Эксперт С++
4397 / 3233 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
02.11.2015, 14:51 #13
Цитата Сообщение от ilyadenisovid Посмотреть сообщение
Это только для массивов верно
sizeof возвращает размер в байтах, который займет объект или тип при размещении на стеке.
Для получения кол-ва элементов массива (речь конечно о чистых сишных массивах, а не о каком-нибудь std::vector) нужно поделить размер массива на размер одного элемента:
C++
1
2
int a[] = {1,2,3,10};
int size = sizeof(a)/sizeof(*a); // получим 4
1
ilyadenisovid
29 / 44 / 8
Регистрация: 20.03.2013
Сообщений: 154
02.11.2015, 15:24  [ТС] #14
Ну я про это и имел в виду.

Не поможете с алгоритмом для создания str_raplace для c++.

Я так понимаю, нужны два цикла: один перебирает символы из исходной строки, а другой для перебора символов из строки, которую нужно найти. Но только я не представляю пока, как нужно действовать после того, как 1 символ из искомой строки мы нашли в исходной. Подскажите, если не сложно.
0
anti-k
227 / 75 / 23
Регистрация: 17.07.2015
Сообщений: 774
Завершенные тесты: 1
02.11.2015, 15:53 #15
ilyadenisovid,
Вот такой вот гавнокодец с небольшой утечечкой ))
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
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<cstring>
using namespace std;
char* Changen(char*ch,char name[],char name1[] )
{
    char*pts=strstr(ch, name);
    char*pt = pts + strlen(name);
    char* temp = new char[100]();
    strncpy(temp, ch, (int)(pts - ch));
    strcat(temp, name1);
    strcat(temp, pt);
    //delete[] ch;
    ch = new char[strlen(temp) + 1]();
    strcpy(ch, temp);
    delete[] temp;
        return ch;
}
int main()
{
    char* ch = new char[strlen("I have a daughter")+1]();
    strcpy(ch, "I have a daughter blin");
    cout << ch << endl;
    char name[9] = { 0 };
    strcpy(name, "daughter");
    char name1[4] = { 0 };
    strcpy(name1, "son");
 
    ch = Changen(ch, name, name1);
    cout << ch;
 
 
    system("pause");
}
Добавлено через 2 минуты
Tulosba,
Мое почтение!Подскажите пожалуйста, почему, когда я делитаю ch[](постом выше)Heap corruption detected
причем нашел это CRT
0
02.11.2015, 15:53
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.11.2015, 15:53
Привет! Вот еще темы с ответами:

Нюансы работы со строками: как в C++ можно объявлять и инициализировать строки? - C++
Добрый день! Подскажите пожалуйста, как в 17-ой строке присвоить слово? Один символ присваивается, но со словом и тем более предложением...

Класс для работы со строками CString - C++
Написать текстовый редактор с параметрами 1. Вставка в начало 2. Копирование строк 3. Поиск в строке Мне непонятна одна вещь: как...

ВопросЫ по функциям для работы со строками с++ - C++
Вот я нашел большинство (если не все) стандартные функции C++ для работы со строками: Я вычитал что функция memcpy копирует за такт...

Создать класс для работы сo строками - C++
Создать класс для работы сo строками. Разработать элементы класса: a. Поля: * указатель на char - хранит адрес динамически выделенной...


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

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

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