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

Функция удаляющая пробелы в начале и конце строки

01.12.2022, 18:59. Показов 1061. Ответов 17
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Разработайте функцию std::string TrimBlanks(std::string const& str),
выполняющую отрезание пробелов в начале и в конце строки str, и
возвращающую результирующую строку Разработайте на ее основе
программу, выполняющую отрезание пробелов в начале и конце каждой
строки, поступающей со стандартного потока ввода, и выводящую
результат в стандартный поток вывода.
Здравствуйте, как можно сделать передачу ссылки на const string в функции TrimBlanks и как сделать функцию space_ рабочей?
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
#include <iostream>
#include <algorithm>
#include <string>
using namespace std;
bool space_(string const& str) {
    if (str.find(' ') != string::npos) {
        return false;
    }
    else {
        return true;
    }
}
string TrimBlanks(string& str) {
    auto it = find_if_not(str.begin(), str.end(), space_);
    str.erase(str.begin(), it);
    auto it1 = find_if_not(str.rbegin(), str.rend(), space_).base();
    str.erase(it1, str.end());
    return str;
}
 
int main()
{
    setlocale(LC_ALL, "Ru");
    string str;
    cout << "Введите строку: " << endl;
    getline(cin, str);
    cout << TrimBlanks(str);
}
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
01.12.2022, 18:59
Ответы с готовыми решениями:

Функция удаляющая пробелы в начале и в конце строки
Разработайте функцию std::string TrimBlanks(std::string const&amp; str), выполняющую отрезание пробелов в начале и в конце строки str, и...

Функция удаляющая элементы списка в начале и в конце
вообщем есть такая функция, которая в конце выводит нужные цифры, но с мусором, который я не догоняю как убрать, вот собственно код: ...

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

17
Just Do It!
 Аватар для XLAT
4211 / 2668 / 655
Регистрация: 23.09.2014
Сообщений: 9,083
Записей в блоге: 3
01.12.2022, 20:56
Лучший ответ Сообщение было отмечено ElNikito как решение

Решение

Цитата Сообщение от ElNikito Посмотреть сообщение
как сделать функцию space_ рабочей?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
#include <algorithm>
#include <string_view> /// C++17
using namespace std;
bool space_(char str){   return str == ' '; }
 
string_view TrimBlanks(string_view str)
{   auto it  = find_if_not(str.begin (), str.end (), space_);
    auto it1 = find_if_not(str.rbegin(), str.rend(), space_).base();
    return str.substr(it - str.begin(), it1 - it);
}
 
int main()
{   setlocale(LC_ALL, "Ru");
    string str;
    wcout << L"Введите строку: " << endl;
    getline(cin, str);
    cout << TrimBlanks(str);
 
}
1
3 / 3 / 1
Регистрация: 01.12.2022
Сообщений: 5
01.12.2022, 20:58  [ТС]
Спасибо за ответ, все работает! Только нужно мне было прописать в функции space_ не c != ' ', а c == ' ' и тогда программа будет выполнять свою функциюю
1
118 / 86 / 35
Регистрация: 07.11.2022
Сообщений: 355
01.12.2022, 22:27
XLAT,
никогда не пользовался std::string_view.
сейчас стал смотреть, что это такое, увидел в вашем коде undefined behavior.

ваши функции без изменений , main немного изменил
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 <algorithm>
#include <string_view> /// C++17
 
bool space_(char str){   return str == ' '; }
 
std::string_view TrimBlanks(std::string_view str)
{   auto it  = std::find_if_not(str.begin (), str.end (), space_);
    auto it1 = std::find_if_not(str.rbegin(), str.rend(), space_).base();
    return str.substr(it - str.begin(), it1 - it);
}
 
int main()
{  
    std::string str;
    std::cout << "Enter string: " << std::endl;
    std::getline(std::cin, str);
    std::string_view s_view =  TrimBlanks(str);
    str = "What the hell is going on?\n";
    std::cout << s_view;
 
}
0
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
01.12.2022, 22:37
Цитата Сообщение от NEED-A-JOB Посмотреть сообщение
увидел в вашем коде undefined behavior.
Расскажи-ка милая, где была, покажи где UB ты нашла ?
0
118 / 86 / 35
Регистрация: 07.11.2022
Сообщений: 355
01.12.2022, 22:45
SmallEvil, правда не видите ?
код запустили ?
https://www.learncpp.com/cpp-t... tring_view
0
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
01.12.2022, 22:53
NEED-A-JOB, в вашем коде - вижу.
В коде XLAT, не вижу.

А вот что вы написали.
Цитата Сообщение от NEED-A-JOB Посмотреть сообщение
XLAT,
никогда не пользовался std::string_view.
сейчас стал смотреть, что это такое, увидел в вашем коде undefined behavior.
Читаете всякую муть.
https://en.cppreference.com/w/... tring_view
Читаем что он из - себя представляет. Со всеми вытекающими последствиями.

Добавлено через 3 минуты
Кроме того что у XLAT, использует широкую строку, wcout и cout одновременно
0
Just Do It!
 Аватар для XLAT
4211 / 2668 / 655
Регистрация: 23.09.2014
Сообщений: 9,083
Записей в блоге: 3
01.12.2022, 22:53
Цитата Сообщение от NEED-A-JOB Посмотреть сообщение
увидел в вашем коде undefined behavior.
в s_view нет ничего - он пустой, как барабашка.
string_view не является хозяином своего содержимого.
юзать его нужно если хотца избежать ненужного копирования.
это особенно актуально если у вас нагруженное приложение.
0
118 / 86 / 35
Регистрация: 07.11.2022
Сообщений: 355
01.12.2022, 22:58
Цитата Сообщение от SmallEvil Посмотреть сообщение
NEED-A-JOB, в вашем коде - вижу.
В коде XLAT, не вижу.
Цитата Сообщение от XLAT Посмотреть сообщение
string_view не является хозяином своего содержимого.
я ж вам о чем и толкую . взял функции XLAT и
получил UB
Если вас это устраивает, ну ОК .
0
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
01.12.2022, 23:04
Взял strcpy() и получил UB. Прикинь. Все ложь
C++
1
2
char * dest;
strcpy(dest, src);
1
Just Do It!
 Аватар для XLAT
4211 / 2668 / 655
Регистрация: 23.09.2014
Сообщений: 9,083
Записей в блоге: 3
01.12.2022, 23:12
Цитата Сообщение от SmallEvil Посмотреть сообщение
Все ложь
как раз хотел написать

NEED-A-JOB, я из любой функции смогу получить UB.

вы испортили содержимое и продолжаете ссылаться на него.

очевидно, что в вашем случае нужно так:

C++
1
2
3
4
5
6
7
8
9
int main()
{
    std::string str;
    std::cout << "Enter string: " << std::endl;
    std::getline(std::cin, str);
    std::string s_view(TrimBlanks(str));
    str = "What the hell is going on?\n";
    std::cout << s_view;
}
0
118 / 86 / 35
Регистрация: 07.11.2022
Сообщений: 355
02.12.2022, 12:52
Цитата Сообщение от SmallEvil Посмотреть сообщение
Взял strcpy() и получил UB. Прикинь. Все ложь
это понимаю, и всё же как трудно принять такое поведение.
по мне, такое поведение необычно.

Добавлено через 36 секунд
не могу выразить самостоятельно , но нашел подходящее
вот товарищ написал

https://stackoverflow.com/ques... o%20teach.

Добавлено через 32 секунды
-------------------
The one major obstacle and divergence from the C++ standard library philosophy that I can think of is that such "referential view" classes have completely different ownership semantics from the rest of the standard library. Basically, everything else in the standard library is unconditionally safe and correct (if it compiles, it's correct). With reference classes like this, that's no longer true. The correctness of your program depends on the ambient code that uses these classes. So that's harder to check and to teach.
0
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
02.12.2022, 13:12
NEED-A-JOB, не согласен с приведенной цитатой.
Взять хотя бы итераторы, это тоже ссылочные объекты.
И тоже часто-густо становятся невалидными.
В классах с итераторами, описаны методы после которых те или иные итераторы становятся невалидными.
То есть UB.
И это не какая-то экзотика.

Не нравится string_view ?
Есть старые добрые указатели.
Есть std::ref.
С ними все тоже самое.

Добавлено через 8 минут
Теперь к практике по строкам.
Дан текст, большого объема (книга, сборник томов).
И задачи на его анализ.
Нам не нужно его изменять (можно считать текст константным).
Цитата Сообщение от cppreference.com
The class template basic_string_view describes an object that can refer to a constant contiguous sequence of char-like objects with the first element of the sequence at position zero.
И все эти затраты на разбивку, множественные выделения памяти и общее ее потребление, могут быть минимизированы с помощью такого прокси класса как string_view.
0
118 / 86 / 35
Регистрация: 07.11.2022
Сообщений: 355
02.12.2022, 14:04
Цитата Сообщение от SmallEvil Посмотреть сообщение
не согласен с приведенной цитатой.
Взять хотя бы итераторы, это тоже ссылочные объекты.
И тоже часто-густо становятся невалидными.
В классах с итераторами, описаны методы после которых те или иные итераторы становятся невалидными.
То есть UB.
И это не какая-то экзотика.
это вообще мимо. где в с++ еще есть такое, что один контейнер меняет другой контейнер ?
обращаемся к вектору. через указатели, итераторы.
мы обращаемся к конкретному вектору. не к другому экземпляру вектора, а к одному вектору
через итератор. мы нацелены на конкретный вектор, через другие объекты.
если ломается итератор при изменении вектора- это ожидаемое поведение.

А вот если ломается вектор, при изменении ДРУГОГО вектора, то это
какое-то чудо расчудесное.
трудно такое воспринимается....
0
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
02.12.2022, 14:48
Цитата Сообщение от NEED-A-JOB Посмотреть сообщение
это вообще мимо
Как раз таки в "яблочко".

Так где же ломается строка при использовании string_view ?
Это при изменении исходной строки , string_view становится невалидным, так же как и указатели.

NEED-A-JOB, не понимаю вашей логики.
Скорее всего, вы просто ушли в отрицание.

Добавлено через 1 минуту
Цитата Сообщение от NEED-A-JOB Посмотреть сообщение
если ломается итератор при изменении вектора- это ожидаемое поведение.
Тоже самое происходит и со string_view.
Прям один в один.

Вот вы сами все и доказали.

Добавлено через 5 минут
Цитата Сообщение от NEED-A-JOB Посмотреть сообщение
мы обращаемся к конкретной строке. не к другому экземпляру строки, а к одной строке
через string_view. мы нацелены на конкретную строку, через другие объекты.
если ломается string_view при изменении строки - это ожидаемое поведение.
конкретному вектору -> конкретная строка
итератор -> string_view
0
Гвоздь Задиров
 Аватар для Folian
1719 / 1118 / 337
Регистрация: 25.01.2019
Сообщений: 2,946
02.12.2022, 14:55
Цитата Сообщение от NEED-A-JOB Посмотреть сообщение
где в с++ еще есть такое, что один контейнер меняет другой контейнер ?
string_view - это не контейнер. Там внутри размер и указатель, грубо говоря.

Не придёт ж в здравом уме никому делать чонить такое?
C++
1
2
3
4
5
6
    int* a { new int };
    int* p { a };
 
    delete a;
 
    *p = 10; ////????
1
 Аватар для Kuzia domovenok
4268 / 3327 / 926
Регистрация: 25.03.2012
Сообщений: 12,536
Записей в блоге: 1
02.12.2022, 14:57
Цитата Сообщение от NEED-A-JOB Посмотреть сообщение
если ломается итератор при изменении вектора- это ожидаемое поведение.
C++
1
2
3
4
5
6
7
8
vector<int> a = {1, 2, 3};
vector<int>::iterator i = a.begin();
a.push_back(4);
a.push_back(4);
a.push_back(4);
a.push_back(4);
a.push_back(4);
assert(*i == 1);
если меняется вектор - итератор на него ломается
если меняется строка - string_view на неё ломается
почему одно для вас ожидаемо, а второе неожиданно?
Почему для вас случаи не аналогичны?
1
118 / 86 / 35
Регистрация: 07.11.2022
Сообщений: 355
02.12.2022, 15:34
Цитата Сообщение от Folian Посмотреть сообщение
string_view - это не контейнер. Там внутри размер и указатель, грубо говоря.
ладно, вроде отпустило
описание boost string view перечитал ,
A boost::string_view is a read-only reference to a contiguous sequence of characters, and provides much of the functionality of std::string.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
02.12.2022, 15:34
Помогаю со студенческими работами здесь

Функция удаляющая из строки подряд идущие пробелы
Опишите функцию, удаляющую из строки ,переданной ей в качестве параметра , все подряд идущие пробелы (кроме первого ). В случае успеха...

Во введенной пользователем строке удалите все пробелы в начале и конце строки
Во введенной пользователем строке удалите все пробелы в начале и конце строки. Я ищу первый индекс символа не равного пробелу и с конца...

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

В строке символов удалить все пробелы в начале и в конце строки, удвоить пробелы в середине строки и напечатать количество слов
В строке символов удалить все пробелы в начале и в конце строки, удвоить пробелы в середине строки и напечатать количество слов. ...

Удалить повторяющиеся пробелы, также пробелы в начале и в конце строки (ассемблерная вставка)
Написать ассемблерную вставку, реализующую следующую обработку строки: согласно варианту. Оформить ее в виде отдельной функции....


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

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Новые блоги и статьи
BOINC: 22 года — и всё ещё работает
Programma_Boinc 12.03.2026
BOINC: 22 года — и всё ещё работает Дэвид Андерсон написал ретроспективу. Кратко: в 2001 году он ушёл из United Devices, где был CTO, и за несколько месяцев написал ядро BOINC — клиент, сервер,. . .
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru