Форум программистов, компьютерный форум CyberForum.ru

Класс "Cтрока" - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Найти максимальное число из 3 чисел http://www.cyberforum.ru/cpp-beginners/thread1538676.html
#include <iostream> #include <stdlib.h> using namespace std; int main() { int x, y, z; cin >> x, y, z; cout << max(max(x,y), z);
C++ Ошибка: M_PI: необъявленный идентификатор #include <iostream> #include <locale> #include <math.h> #define _USE_MATH_DEFINES using namespace std; int main() { setlocale(LC_ALL, "Russian"); http://www.cyberforum.ru/cpp-beginners/thread1538675.html
C++ Сделать так, чтобы программа сортировала по названию (по алфавиту) введеные пользователем названия
#include "stdafx.h" #include <iostream> #include <cstring> #include <string> #include "conio.h" #include <iomanip> using namespace std; struct file {
Как добавить элемент в конец массива и расширить его на одну позицию? C++
как добавить элемент в конец? просидел 5 часов , прошустрил кучу сайтов и не сообразил. (через vector не подходит) #define N 100 // Длина массива. int In(int n, int *arr) {
C++ Поиск числа в списке http://www.cyberforum.ru/cpp-beginners/thread1538638.html
Добрый вечер. У меня есть шаблонный класс List<T>. Как правильно написать глобальную функцию Find() для поиска в этом списке значения? Вот выкладываю самое нужное #ifndef _HEADER_H_ #define _HEADER_H_ #include <iostream>
C++ Указатель на char Есть вопрос про указатель на чар: char *x = "okay"; cout <<*x; Объявляю указатель на чар и присваиваю ему строку "окау". Разыменовываю указатель и получаю букву "о". Все понятно, строка- указатель на первый символ строки, поэтому в *х содержится адрес первого символа строки "окау", то есть адрес буквы "о", все логично. Но когда я пишу: char *x = "okay"; cout <<x; подробнее

Показать сообщение отдельно
minimum_y
 Аватар для minimum_y
13 / 13 / 2
Регистрация: 26.05.2013
Сообщений: 39
27.09.2015, 01:20     Класс "Cтрока"
Набросал на скорую руку

my_string.h

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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
#pragma once
 
/*
    Класс представляет строку.
*/
class MyString final
{
 public:
 
     /*
        Инициализация пустой строки.
     */
     MyString();
 
     /*
        Инициализация строкой символов.
     */
     MyString(const char* s);
 
     /*
        Инициализация путем копирования другой строки.
     */
     MyString(const MyString& s);
 
     MyString& operator = (const MyString& s);
 
     /*
        Возвращает указатель на данные.
     */
     const char* c_str() const;
 
     /*
        Возвращает длину строки.
     */
     size_t length() const;
 
     /*
        Преобразует символоы строки в строчные символы.
     */
     void toLowerCase();
 
     /*
        Возвращает true, когда вызывающая строка является подстрокой s.
     */
     bool isSubstring(const MyString& s) const;
 
     /*
        Удаляет все вхождения подстроки.
     */
     void removeSubstring(const MyString& s);
 
     /*
        Очищает память.
     */
     ~MyString();
 
 private:
 
     char* mBuffer;
     size_t mLength;
 
     void setBuffer(const char* s);
};

my_string.cpp

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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
#include "my_string.h"
#include <string.h> // memcpy, strlen, strcpy, strstr
#include <wctype.h> // towlower
#include <stdexcept>
 
 
MyString::MyString()
    : MyString("")
{
}
 
MyString::MyString(const char* s)
{
    if ((s == nullptr))
    {
        throw std::invalid_argument("Null pointer 's'");
    }
 
    setBuffer(s);
}
 
MyString::MyString(const MyString& s)
{
    setBuffer(s.mBuffer);
}
 
MyString& MyString::operator = (const MyString& s)
{
    if (this == &s)
        return *this;
 
    setBuffer(s.mBuffer);
    return *this;
}
 
const char* MyString::c_str() const
{
    return mBuffer;
}
 
size_t MyString::length() const
{
    return mLength;
}
 
void MyString::toLowerCase()
{
    for (size_t i = 0u; i < mLength; ++i)
    {
        mBuffer[i] = ::towlower(mBuffer[i]);
    }
 
    // или так, если библиотечные функции не подходят (проверено только на латинице)
 
    //const int DIFF = 'a' - 'A';
    //for (size_t i = 0u; i < mLength; ++i)
    //{
    //  char symbCode = mBuffer[i];
    //  if (symbCode >= 65 && symbCode <= 90)
    //  {
    //      mBuffer[i] = (symbCode + DIFF);
    //  }
    //}
}
 
bool MyString::isSubstring(const MyString& s) const
{
    // этот метод можно вообще удалить, если не хочется пользоваться библиотечными функциями
    return (::strstr(s.mBuffer, mBuffer) != nullptr);
}
 
void MyString::removeSubstring(const MyString& s)
{
    if (!s.isSubstring(*this))
    {
        return;
    }
 
    size_t substringLength = s.length();
    while (char* p = ::strstr(mBuffer, s.mBuffer))
    {
 
        size_t symbCount = mLength - substringLength;
        size_t bufferSize = symbCount + 1u;
 
        char* temp = static_cast<char*>(::malloc(bufferSize));
        if (temp == nullptr)
        {
            throw std::runtime_error("malloc fails");
        }
 
        ::memset(temp, 0, bufferSize);
 
        ::memcpy(temp, mBuffer, p - mBuffer);
        ::memcpy(temp + (p - mBuffer), p + substringLength, (mBuffer + mLength) - (p + substringLength));
 
        ::free(mBuffer);
        setBuffer(temp);
        ::free(temp);
    }
}
 
MyString::~MyString()
{
    ::free(mBuffer);
}
 
void MyString::setBuffer(const char* s)
{
    size_t len = ::strlen(s);
    size_t bufferSize = len + 1u;
    mBuffer = static_cast<char*>(::malloc(bufferSize));
 
    if (mBuffer == nullptr)
    {
        throw std::runtime_error("malloc fails");
    }
 
    ::strcpy_s(mBuffer, bufferSize, s);
    mLength = len;
}
main.cpp

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream>
#include "my_string.h"
 
int main()
{
    MyString s1 = "DDDEDDADBEEFDD";
    MyString s2 = "DD";
 
    if (s2.isSubstring(s1)) // проверка не обязательна
        s1.removeSubstring(s2);
 
    std::cout << s1.c_str() << std::endl; // выведет DEADBEEF
 
    s1.toLowerCase();
    std::cout << s1.c_str() << std::endl; // выведет deadbeef
 
    MyString s3 = s1; // вызовется конструктор копирования
 
    std::cin.get();
    std::cin.get();
    return 0;
}
Добавлено через 9 минут
PS: К оператору присваивания не стал писать комментарий. Почитайте на досуге, что это такое и для чего нужно, вдруг спросят.
 
Текущее время: 14:33. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru