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

Добавить СИМВОЛ в конец строки

28.10.2020, 22:01. Показов 9873. Ответов 5

Студворк — интернет-сервис помощи студентам
Может я что то не понимаю, но даже в дебагере показывает что добавляемый символ есть но копировать не хочет, может это проблема в _strdup()?
C++
1
2
3
4
5
6
7
8
9
10
11
MyString MyString::operator+(char symbol)
{
    MyString tmp_str;
    int size = strlen(str) + 2;
    char* tmp = new char[size];
    strcpy(tmp, str);
    tmp[size] = symbol;
    tmp_str.str = _strdup(tmp);
    tmp_str.capacity = strlen(tmp) + 1;
    return tmp_str;
}
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
28.10.2020, 22:01
Ответы с готовыми решениями:

Добавить символ в конец слова
Здравствуйте, помогите, пожалуйста с кодом. Вот задание: Надо сравнить два слова. К короткому из слов, добавить достаточное количества...

Как переместить символ окончания строки /0 в конец строки?
Это мне нужно сделать, чтоб не появлялись кракозябры. Причем сделать для всех строк подключенного к программе файла.

Вставить символ в конец строки
Проблема с функцией sanitize_str Выводит ошибку в 107 строке invalid conversion from 'char' to '*char'; #include <iostream> ...

5
 Аватар для Annemesski
2670 / 1333 / 479
Регистрация: 08.11.2016
Сообщений: 3,679
29.10.2020, 10:54
Отставить _strdup
C++
1
2
3
4
5
6
7
8
9
10
11
12
MyString MyString::operator+(const char symbol)
{
    MyString ret;
    int size = strlen(str) + 2;
    char* tmp = new char[size];
    strcpy(tmp, str);
    tmp[size - 1] = symbol;
    tmp[size] = '\0';
    ret.str = tmp; // если _strdup, то после нужен delete[] tmp - иначе утечка, а в деструкторе для this->str должен вызываться free, а не delete[]
    ret.capacity = strlen(tmp) + 1;
    return ret;
}
_strdup выделяет память посредством malloc, а значит освобождать эту память надо посредством free, с _strdup-ом у Вас получится что где-то память под строку выделялась через new, а где-то через malloc - как отличать будете?
0
0 / 0 / 0
Регистрация: 20.03.2020
Сообщений: 61
29.10.2020, 14:51  [ТС]
Крашитса
C++
1
2
3
4
5
6
7
8
9
10
11
12
MyString MyString::operator+(const char symbol)
{
    MyString tmp_str;
    int size = strlen(str) + 2;
    char* tmp = new char[size];
    strcpy(tmp, str);
    tmp[size - 1] = symbol;
    tmp[size] = '\0';
    tmp_str.str = tmp;
    tmp_str.capacity = strlen(tmp) + 1;
    return tmp_str;
}
В дебагере всё также бред показывает

вот мейн
C++
1
2
3
4
5
6
7
int main()
{
    MyString a;
    a.input();
    MyString b = a + 'a';
    cout << b;
}
Добавлено через 58 минут
+ я не изучал malloc и не понял про что вы говорили
0
 Аватар для Annemesski
2670 / 1333 / 479
Регистрация: 08.11.2016
Сообщений: 3,679
29.10.2020, 16:14
Цитата Сообщение от Selveresta Посмотреть сообщение
Крашитса
Раелизацию метода MyString::input() и оператора MyString::operator=(const MyString &other) в студию.

Добавлено через 1 минуту
А заодно и реализацию конструкторов класса тоже приводите.
0
0 / 0 / 0
Регистрация: 20.03.2020
Сообщений: 61
29.10.2020, 16:18  [ТС]
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
MyString MyString::operator=(const MyString& s)
{
    MyString tmp_s;
    int size = strlen(s.str);
    char* tmp = new char[size];
    strcpy(tmp, s.str);
    tmp_s.str = _strdup(tmp);
    if (size > capacity)
        tmp_s.capacity = size;
    return tmp_s;
}
 
 
void MyString::input()
{
    char buf[100];
    char* d_buf = new char[100]{};
    cout << "Enter the line->";
    do {
        cin.clear();
        cin.getline(buf, 100);
        concat(d_buf, buf);
    } while (cin.fail());
 
    int len = strlen(d_buf);
    if (len < capacity)
    {
        strcpy(str, d_buf);
        delete[]d_buf;
        return;
    }
    delete[]str;
    capacity = len + 1;
    str = d_buf;
}
Constucts

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
MyString::MyString()
{
    capacity = 80;
    str = new char[capacity] {};
}
 
MyString::MyString(int _capacity)
{
    capacity = _capacity;
    str = new char[capacity] {};
}
 
MyString::MyString(cc _str)
{
    str = _strdup(_str);
    capacity = strlen(str) + 1;
}
 
MyString::MyString(const MyString& obj)
{
    capacity = obj.capacity;
    str = new char[capacity] {};
    strcpy(str, obj.str);
}
 
MyString::MyString(MyString&& obj) noexcept
{
    capacity = obj.capacity;
    str = obj.str;
    obj.str = nullptr;
    obj.capacity = 0;
}
 
MyString::~MyString()
{
    if (capacity)
        delete[]str;
}
Добавлено через 1 минуту
cc - const char *
Через #define объявил
0
 Аватар для Annemesski
2670 / 1333 / 479
Регистрация: 08.11.2016
Сообщений: 3,679
29.10.2020, 16:58
Лучший ответ Сообщение было отмечено Selveresta как решение

Решение

Selveresta,
1. Конструктор из "сс":
уберите этот _strdup, выделите память через new char[strlen(_str) + 1] и воспользуйтесь strcpy, иначе не будет гарантии что деструктор Вашего класса корректно отработает для строк созданных этим конструктором.

Цитата Сообщение от Selveresta Посмотреть сообщение
cc - const char *
Через #define объявил
лучше объявите псевдоним через typedef
C++
1
typedef const char * cc;
2. Оператор присваивания копированием:
- забудьте про _strdup (ну или переделывайте весь класс под malloc/free)
- char* tmp = new char[size]; size + 1
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
29.10.2020, 16:58
Помогаю со студенческими работами здесь

Проверить что символ не конец строки
как проверить что в char A; лежит значение hex (0) т.е. мне нужно проверить, что в это не символ конца строки?

Добавить в конец первой строки, последние n2-n1 слов второй строки
помогите пожалуйста! Даны две строки. Пусть n1 - число слов в первой строке, а n2 - во второй (n1&lt;n2). Добавить в конец первой строки,...

Добавить в конец каждой строки необходимо количество «*» что бы выровнять текст по правому краю большей строки
Дано некоторое количество строк, не больше как размер текстового окна. Добавить в конец каждой строки необходимо количество «*» что бы...

В строке скопировать каждый второй символ в конец строки
есть задача: в строке s скопировать каждый 2й символ в конец строки. я не могу понять в чем ошибка, либо просто не понял условие ...

Дана строка. Добавить в конец строки её длину
Не знаю,какую команду использовать для этого, так как работа должна быть сделана через динамический массив символов. Вот фрагмент...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru