Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 15, средняя оценка - 4.80
clown_exe
0 / 0 / 0
Регистрация: 16.01.2014
Сообщений: 20
#1

Заменить каждую последовательность, содержащую более одного пробела, на один пробел - C++

16.01.2014, 04:26. Просмотров 2609. Ответов 34
Метки нет (Все метки)

В заданной строке заменить каждую последовательность, содержащую более одного пробела, на один
пробел.
Например: "a bcd ef . gh 90" - "a bcd ef . gh 90"

Всё что я на данный момент смог, это создать строку... Подскажите
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.01.2014, 04:26
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Заменить каждую последовательность, содержащую более одного пробела, на один пробел (C++):

Заменить в строке каждую последовательность из двух и более пробелов на один пробел
Разработать алгоритм обработки строки символов,которая может содержать буквы...

Каждую группу из n последовательно стоящих символов ‘’ (пробел) и '\t' (табуляция) заменить на один пробел
Каждую группу из n последовательно стоящих символов ‘’ (пробел) и '\t' ...

Заменить в строке последовательность пробелов на один пробел.
#include <stdio.h> int main() { char str; int i; gets(str);

В тексте вставить между словами вместо одного пробела запятую и пробел
Доброго времени суток! В С++ я полный ноль. Пытаюсь разобраться со строками....

Каждую латинскую букву, идущую после пробела, заменить на большую
Разработать функцию Change(const S:string):string, возвращающую строку, в...

Заменить в тексте каждую точку многоточием, если после точки есть пробел
Заменить в тексте каждую точку многоточием, если после точки есть пробел.

34
MrGluck
Модератор
Эксперт CЭксперт С++
7980 / 4861 / 1422
Регистрация: 29.11.2010
Сообщений: 13,234
16.01.2014, 04:32 #2
C++
1
2
3
4
5
6
7
8
9
10
11
#include <iostream>
#include <sstream>
#include <string>
 
int main()
{
    std::string str;
    std::getline(std::cin, str);
    std::istringstream ist(str);
    for (std::string word; ist >> word; std::cout << word << " ");
}
Очень показательный пример у вас
1
clown_exe
0 / 0 / 0
Регистрация: 16.01.2014
Сообщений: 20
16.01.2014, 04:37  [ТС] #3
Простите, вы бы не могли пояснить, что означает std: и структуру работы. Я "умею" писать только с помощью printf - scanf
0
abit
272 / 271 / 83
Регистрация: 03.02.2013
Сообщений: 770
16.01.2014, 04:40 #4
Цитата Сообщение от clown_exe Посмотреть сообщение
Простите, вы бы не могли пояснить, что означает std: и структуру работы. Я "умею" писать только с помощью printf - scanf
std - это область видимости стандартной библиотеки C++ иначе называемой STL
а свои printf/scanf засуньте в ... Си, тут C++
0
Croessmah
++Ͻ
14146 / 8071 / 1512
Регистрация: 27.09.2012
Сообщений: 19,905
Записей в блоге: 3
Завершенные тесты: 1
16.01.2014, 04:40 #5
Цитата Сообщение от clown_exe Посмотреть сообщение
Я "умею" писать только с помощью printf - scanf
Си?
Цитата Сообщение от clown_exe Посмотреть сообщение
что означает std: и структуру работы.
using namespace std
0
clown_exe
0 / 0 / 0
Регистрация: 16.01.2014
Сообщений: 20
16.01.2014, 04:41  [ТС] #6
Цитата Сообщение от Croessmah Посмотреть сообщение
C++
0
Croessmah
++Ͻ
14146 / 8071 / 1512
Регистрация: 27.09.2012
Сообщений: 19,905
Записей в блоге: 3
Завершенные тесты: 1
16.01.2014, 04:42 #7
Цитата Сообщение от abit Посмотреть сообщение
область видимости
scope
0
clown_exe
0 / 0 / 0
Регистрация: 16.01.2014
Сообщений: 20
16.01.2014, 04:45  [ТС] #8
Цитата Сообщение от abit Посмотреть сообщение
std - это область видимости стандартной библиотеки C++ иначе называемой STL
а свои printf/scanf засуньте в ... Си, тут C++
Эх, ещё не пробовал писать так,но видимо пора научиться

Добавлено через 2 минуты
Цитата Сообщение от abit Посмотреть сообщение
std - это область видимости стандартной библиотеки C++ иначе называемой STL
а свои printf/scanf засуньте в ... Си, тут C++
Я благодарен за пояснение и совет, я прислушаюсь.
Но всё же, вы бы не могли помочь мне с программой ?
0
MrGluck
Модератор
Эксперт CЭксперт С++
7980 / 4861 / 1422
Регистрация: 29.11.2010
Сообщений: 13,234
16.01.2014, 04:51 #9
Цитата Сообщение от abit Посмотреть сообщение
стандартной библиотеки C++ иначе называемой STL
совсем не так. STL - стандартная библиотека шаблонов, она входит в стандартную библиотеку, но последняя не состоит исключительно из STL. Например, iostream, string...

В своей программе я сначала объявил строку (std::string). Затем считал в неё данные, использую getline, что позволяет записать не одно слово, а грубо говоря все, что ввели до нажатия Enter. Потом я инициализирую объект istringstream данной строкой. Данный объект позволяет считывать с него данные как если бы мы читали со стандартного устройства ввода (std::cin).
Потом в цикле я объявляю слово - элемент std::string и до тех пор, пока у меня удалось считать новый элемент с "буфера" - вывожу его на экран, разделяю пробелами.
Вот и все, осталось лишь подтянуть матчасть.
1
abit
272 / 271 / 83
Регистрация: 03.02.2013
Сообщений: 770
16.01.2014, 04:56 #10
Цитата Сообщение от clown_exe Посмотреть сообщение
Я благодарен за пояснение и совет, я прислушаюсь.
Но всё же, вы бы не могли помочь мне с программой ?
Чем конкретно помочь? код от MrGluck очень удачен и есть решение

Добавлено через 4 минуты
совсем не так. STL - стандартная библиотека шаблонов, она входит в стандартную библиотеку, но последняя не состоит исключительно из STL. Например, iostream, string...
это не есть предмет о чём спорить, да iostream там вроде не входят, но всё же таки входят - http://msdn.microsoft.com/ru-ru/library/hft11816.aspx
отстаёте от жизни )
1
MrGluck
Модератор
Эксперт CЭксперт С++
7980 / 4861 / 1422
Регистрация: 29.11.2010
Сообщений: 13,234
16.01.2014, 04:58 #11
abit, старые библиотеки iostream - iostream.h, в них объекты std::cin и std::cout используют глобальное пространство имен, т.е. ::cin, ::cout. Строго говоря, там вообще нет пространства имен т.к. писались они как раз до введения namespace-ов.

http://ru.wikipedia.org/wiki/Стандартная_библиотека_языка_C%2B%2B
1
Croessmah
++Ͻ
14146 / 8071 / 1512
Регистрация: 27.09.2012
Сообщений: 19,905
Записей в блоге: 3
Завершенные тесты: 1
16.01.2014, 05:00 #12
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <cstdio>
 
 
void foo ( char * dest , const char * source ) {
  for( ; (*dest=*source);++source,++dest){
    if(*source!=' ')
      continue;
    *(dest++)=*source;
    for(;*source==' ';++source)
      ;
    *dest=*source;
  }
}
 
 
int main(){
  char str [ 1024 ] ;
  printf ( "Input string->") ;
  gets ( str ) ;
  foo ( str , str ) ;
  printf ( "\n%s" , str ) ;
}
1
clown_exe
0 / 0 / 0
Регистрация: 16.01.2014
Сообщений: 20
16.01.2014, 05:01  [ТС] #13
Цитата Сообщение от abit Посмотреть сообщение
Чем конкретно помочь? код от MrGluck очень удачен и есть решение
Проблема в том, что его код написан сложно для меня... =(
И как я проверил он выполняет немного другую функцию. Я не знаю, как в строке искать символ Пробела, и если несколько пробелов идут друг за другом , заменить их на 1. Мне бы хоть, нужные функции найти.
0
abit
272 / 271 / 83
Регистрация: 03.02.2013
Сообщений: 770
16.01.2014, 05:06 #14
Цитата Сообщение от clown_exe Посмотреть сообщение
Проблема в том, что его код написан сложно для меня... =(
И как я проверил он выполняет немного другую функцию. Я не знаю, как в строке искать символ Пробела, и если несколько пробелов идут друг за другом , заменить их на 1. Мне бы хоть, нужные функции найти.
скорее всего нужная вам "функция" - это std::string::find_first_of( " " ) - http://www.cplusplus.com/reference/string/string/find_first_of/
от туда начинайте свои копания
1
clown_exe
0 / 0 / 0
Регистрация: 16.01.2014
Сообщений: 20
16.01.2014, 05:09  [ТС] #15
Croessmah, Спасибо, программа работает, но функция написанная вами... не могли бы вы её пояснить построчно, немного ?
0
MrGluck
Модератор
Эксперт CЭксперт С++
7980 / 4861 / 1422
Регистрация: 29.11.2010
Сообщений: 13,234
16.01.2014, 05:10 #16
Цитата Сообщение от clown_exe Посмотреть сообщение
Проблема в том, что его код написан сложно для меня... =(
даже после подробнейшего объяснения и отсылкой к нормальной доке с примерами?
Да там всего 4 строки, и то вся работа программы лишь в одной, первые 3 - инициализация.
Ну пишите свои костыли и логику на if. Потом все равно поймете, что уделить 5-10 минут времени на изучение istringstream было проще.
0
clown_exe
0 / 0 / 0
Регистрация: 16.01.2014
Сообщений: 20
16.01.2014, 05:12  [ТС] #17
Цитата Сообщение от MrGluck Посмотреть сообщение
Ну пишите свои костыли и логику на if. Потом все равно поймете, что уделить 5-10 минут времени на изучение istringstream было проще.
Это понятно, что было лучше. Но пока, что я умею совсем не много, в этом вся причина
0
MrGluck
16.01.2014, 05:16
  #18

Не по теме:

Цитата Сообщение от clown_exe Посмотреть сообщение
Но пока, что я умею совсем не много, в этом вся причина
Все время ожидая чужого решения, так ничему и не научитесь

1
Croessmah
++Ͻ
14146 / 8071 / 1512
Регистрация: 27.09.2012
Сообщений: 19,905
Записей в блоге: 3
Завершенные тесты: 1
16.01.2014, 05:17 #19
C
1
2
3
4
5
6
7
8
9
10
11
12
13
void foo ( char * dest , const char * source ) {
  for( ; (*dest=*source);++source,++dest){//Цикл пока не встретим '\0' в исходной строке
    if(*source!=' ')//Если символ не пробел, то
      continue;//Переходим к следующей итеррации
 
    //первый пробел заносим в результирующую строку
    for(*(dest++)=*(source++);*source==' ';++source)//"крутим" пока не пройдем все пробелы
      ;
    //"кидаем" символ за последовательностью пробелов в конечную строку
    if ( !(*dest=*source) ) //Если это символ '\0', 
      break;//то прекращаем цикл
  }
}
0
clown_exe
0 / 0 / 0
Регистрация: 16.01.2014
Сообщений: 20
16.01.2014, 05:23  [ТС] #20
Цитата Сообщение от MrGluck Посмотреть сообщение
Все время ожидая чужого решения, так ничему и не научитесь
В то время пока я жду, я читаю о незнакомых мне функциях, я сразу попытался разобраться в том коде, который мне дали, и до сих пор читаю. Просто пока, что это сложновато понять. Слишком много информации за короткий срок. Стараюсь разобраться. Поэтому и прошу помощи, что бы пояснили код, что бы разобраться с этими элементами и в следующий раз попробовать написать так самому

Добавлено через 4 минуты
Croessmah, cпасибо, стало гораздо понятнее, но можно узнать, что означает * повсюду, какую смысловую нагрузку они несут ?
0
16.01.2014, 05:23
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.01.2014, 05:23
Привет! Вот еще темы с решениями:

Вставить после каждого символа «.» один символ « » (пробел), если после точки нет пробела.
Вставить после каждого символа «.» один символ « » (пробел), если после точки...

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

Заменить подряд идущие пробелы на один пробел
2) В заданной строке заменить подряд идущие пробелы на один пробел (посредством...

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


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

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

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