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

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

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

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

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

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

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

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

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

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

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

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

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

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
MrGluck
Модератор
Эксперт CЭксперт С++
7209 / 4375 / 638
Регистрация: 29.11.2010
Сообщений: 11,887
16.01.2014, 05:10 #16
Цитата Сообщение от clown_exe Посмотреть сообщение
Проблема в том, что его код написан сложно для меня... =(
даже после подробнейшего объяснения и отсылкой к нормальной доке с примерами?
Да там всего 4 строки, и то вся работа программы лишь в одной, первые 3 - инициализация.
Ну пишите свои костыли и логику на if. Потом все равно поймете, что уделить 5-10 минут времени на изучение istringstream было проще.
clown_exe
0 / 0 / 0
Регистрация: 16.01.2014
Сообщений: 20
16.01.2014, 05:12  [ТС] #17
Цитата Сообщение от MrGluck Посмотреть сообщение
Ну пишите свои костыли и логику на if. Потом все равно поймете, что уделить 5-10 минут времени на изучение istringstream было проще.
Это понятно, что было лучше. Но пока, что я умею совсем не много, в этом вся причина
MrGluck
16.01.2014, 05:16
  #18

Не по теме:

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

Croessmah
Модератор
Эксперт CЭксперт С++
13132 / 7395 / 828
Регистрация: 27.09.2012
Сообщений: 18,222
Записей в блоге: 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;//то прекращаем цикл
  }
}
clown_exe
0 / 0 / 0
Регистрация: 16.01.2014
Сообщений: 20
16.01.2014, 05:23  [ТС] #20
Цитата Сообщение от MrGluck Посмотреть сообщение
Все время ожидая чужого решения, так ничему и не научитесь
В то время пока я жду, я читаю о незнакомых мне функциях, я сразу попытался разобраться в том коде, который мне дали, и до сих пор читаю. Просто пока, что это сложновато понять. Слишком много информации за короткий срок. Стараюсь разобраться. Поэтому и прошу помощи, что бы пояснили код, что бы разобраться с этими элементами и в следующий раз попробовать написать так самому

Добавлено через 4 минуты
Croessmah, cпасибо, стало гораздо понятнее, но можно узнать, что означает * повсюду, какую смысловую нагрузку они несут ?
MrGluck
Модератор
Эксперт CЭксперт С++
7209 / 4375 / 638
Регистрация: 29.11.2010
Сообщений: 11,887
16.01.2014, 05:24 #21
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>
 
void foo(char *dest, const char *source)
{
    while((*dest = *source++))
        if (*source != ' ')
            dest++;
}
 
int main()
{
    char str1[256], str2[256];
    std::cin.getline(str1, sizeof(str1));
    foo(str2, str1);
    std::cout << str2 << std::endl;
}
abit
262 / 261 / 33
Регистрация: 03.02.2013
Сообщений: 722
16.01.2014, 05:30 #22
Цитата Сообщение от clown_exe Посмотреть сообщение
Croessmah, cпасибо, стало гораздо понятнее, но можно узнать, что означает * повсюду, какую смысловую нагрузку они несут ?
вообще в теории разную, в С/С++ все операторы сильно перегружены - одна из причин не любить эти языки, всё зависит от контекста
в данном случае тут
C++
1
char * dest , const char * source
* означает указатели
тут
C++
1
(*dest=*source)
взятие содержимого по указателям соответствующего типа
и может где-то ещё там в коде приведение типов, или умножение или ещё чего )))
такой вот язык
Croessmah
Модератор
Эксперт CЭксперт С++
13132 / 7395 / 828
Регистрация: 27.09.2012
Сообщений: 18,222
Записей в блоге: 3
Завершенные тесты: 1
16.01.2014, 05:30 #23
MrGluck, тест 1:
Заменить каждую последовательность, содержащую более одного пробела, на один пробел
clown_exe
0 / 0 / 0
Регистрация: 16.01.2014
Сообщений: 20
16.01.2014, 05:32  [ТС] #24
MrGluck, Спасибо большое, правда осталось пару маленьких вопросов по функции.
1) Что означает dest и source? - Это переменные ?
2) Что означает * перед дест и соурс? Для чего они.
3) не могли бы вы напомнить, что означает операция != , а то я не в записях не в книги пока что не могу найти
Croessmah
Модератор
Эксперт CЭксперт С++
13132 / 7395 / 828
Регистрация: 27.09.2012
Сообщений: 18,222
Записей в блоге: 3
Завершенные тесты: 1
16.01.2014, 05:33 #25
Цитата Сообщение от clown_exe Посмотреть сообщение
то означает операция !=
не равно
Цитата Сообщение от clown_exe Посмотреть сообщение
1) Что означает dest и source? - Это переменные ?
2) Что означает * перед дест и соурс? Для чего они.
почитайте по теме "указатели"
clown_exe
0 / 0 / 0
Регистрация: 16.01.2014
Сообщений: 20
16.01.2014, 05:35  [ТС] #26
Цитата Сообщение от Croessmah Посмотреть сообщение
не равно
Спасибо
MrGluck
Модератор
Эксперт CЭксперт С++
7209 / 4375 / 638
Регистрация: 29.11.2010
Сообщений: 11,887
16.01.2014, 05:41 #27
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>
 
void foo(char *dest, const char *source)
{
    while((*dest = *source++))
        if (*dest != ' ' || (*dest == ' ' && *source != ' '))
            dest++;
}
 
int main()
{
    char str1[256], str2[256];
    std::cin.getline(str1, sizeof(str1));
    foo(str2, str1);
    std::cout << str2 << std::endl;
}
clown_exe
0 / 0 / 0
Регистрация: 16.01.2014
Сообщений: 20
16.01.2014, 05:54  [ТС] #28
Цитата Сообщение от Croessmah Посмотреть сообщение
почитайте по теме "указатели"
Уже прочёл, только немного не разобрался когда я должен использовать указатель

Добавлено через 12 минут
Цитата Сообщение от MrGluck Посмотреть сообщение
void foo(char *dest, const char *source
мы тут объявляем указатели с их типом и название, а почему второй указатель является константой ?
MrGluck
Модератор
Эксперт CЭксперт С++
7209 / 4375 / 638
Регистрация: 29.11.2010
Сообщений: 11,887
16.01.2014, 06:00 #29
Цитата Сообщение от clown_exe Посмотреть сообщение
почему второй указатель является константой ?
const не дает возможность изменять объект.
Важно понимать, что const *char str и const char *str разные вещи.
http://www.cyberforum.ru/blogs/18334/blog87.html
MrGluck
16.01.2014, 06:04     Заменить каждую последовательность, содержащую более одного пробела, на один пробел
  #30

Не по теме:

Да, уже глаза залипают

MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.01.2014, 06:04
Привет! Вот еще темы с ответами:

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
16.01.2014, 06:04
Ответ Создать тему
Опции темы

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