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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 104, средняя оценка - 4.69
qwertytol
6 / 6 / 0
Регистрация: 20.02.2009
Сообщений: 116
#1

Удалить лишние пробелы в строке - C++

16.05.2010, 08:35. Просмотров 16391. Ответов 37
Метки нет (Все метки)

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

Удалить лишние пробелы в строке - C++
Дано строку. Удалить лишние пробелы.

Удалить лишние пробелы в строке - C++
удаление лишних пробелов в тексте

В символьной строке удалить все лишние подряд идущие пробелы. - C++
Помогите пожалуйста написать программу,Каким образом можно осуществить: В символьной строке удалить все лишние подряд идущие пробелы?

В символьной строке удалить все лишние подряд идущие пробелы. - C++
помогите пожалуйста написать программу:В символьной строке удалить все лишние подряд идущие пробелы.

Удалить в строке лишние пробелы, оставив между словами ровно по одному - C++
Дана строка состоящая из слов, между которыми есть некое количество пробелов. Требуется удалить лишние пробелы, оставив между словами...

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

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
***GIN***
28 / 28 / 1
Регистрация: 09.04.2010
Сообщений: 60
16.05.2010, 11:56 #16
Зацени, там все есть - <ссылка на форум>

Добавлено через 11 минут
В инете полно инфы про эту ошибку, там вроде как косяк с версией STL еще про это где то в MSDN написано было, в общем ищи дружище, ищи)) и еще подсказка - великий гугл знает все! ну или почти все
0
easybudda
Модератор
Эксперт CЭксперт С++
9625 / 5573 / 947
Регистрация: 25.07.2009
Сообщений: 10,708
16.05.2010, 12:05 #17
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>
#include <sstream>
#include <string>
#include <iterator>
#include <algorithm>
    
int main(){
    std::string buf;
    std::cout << "String: ";
    std::getline(std::cin, buf);
    if ( buf.empty() )
        return 1;
    std::istringstream ist(buf);
    std::copy(std::istream_iterator<std::string>(ist), std::istream_iterator<std::string>(), std::ostream_iterator<std::string>(std::cout, " "));
    return 0;
}
Добавлено через 4 минуты
Цитата Сообщение от ***GIN*** Посмотреть сообщение
там вроде как косяк с версией STL
Ага... В класс string забыли функцию push_back добавить
1
qwertytol
6 / 6 / 0
Регистрация: 20.02.2009
Сообщений: 116
16.05.2010, 12:22  [ТС] #18
easybudda, Спасибо. Ничего не понятно, но работает.
Было бы лучше, переделать код программы в моих постах. В них хоть немного понимаю.
0
nerazzurri
0 / 0 / 0
Регистрация: 26.10.2010
Сообщений: 19
19.11.2010, 18:20 #19
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
#include<iostream.h>
void main()
{int const m=20;
    char txt[m], newtxt[m] ; int j=0, k=0;
    cin.get(txt,m);
 
    for(int i=0; txt[i]!='\0';i++)
        if(txt[i]=='_')
        {k++;
        if(k<=1)
        {newtxt[j]=txt[i]; j++;
        } 
        
        }
 
        else 
        {newtxt[j]=txt[i]; 
        j++;
        k=0;
        }       
        newtxt[j]='\0';
 
            for(i=0; newtxt[i]!='\0'; i++)
                cout<<newtxt[i];
}
0
1234569
5 / 5 / 1
Регистрация: 25.11.2010
Сообщений: 23
25.11.2010, 14:11 #20
Покажите, как убрать рекурсию (сделать из двух функций одну) - не могу понять условия работы циклов.
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
#include <string.h>
#include <stdio.h>
 
void deletes(char *s, int pos)
{
    if ((s[pos]==' ') && (s[pos+1]==' '))
        {
            deletes(s,pos+1); 
        }
    for (unsigned int i=pos;i<strlen(s)-1;i++)
        {
            s[i]=s[i+1];
        }
    s[i]=0;
}
 
void main()
{
    char s[1000];
    gets(s);
    for (unsigned int i=0;i<strlen(s);i++)
    {
        if((s[i]==' ') && (s[i+1]==' '))
        deletes(s,i+1);
    }
    printf("%s\n",s);
}
При использовании кода Sn1pe остаётся неиспользованным pos(и j не изменяется):
Цитата Сообщение от Sn1pe Посмотреть сообщение
Вместо этого:
C++
1
2
3
4
for (i = 0; i < strlen(s); i++)
 {  if ((s[i]==' ') && (s[i+1]==' '))
        deletes(s,i+1);
}
Это:
C++
1
2
3
4
5
6
7
8
for (i=0;i<strlen(s);i++)
{ k=i;
while (k!=strlen(s))
{ if ((s[k]==' ') && (s[k+1]==' ')) {for ([B]j = pos[/B]; j < strlen(s)-1; j++)
 {
  s[j]=s[j+1];
}
s[i]=0;}k++;}}
0
RUSya82
236 / 114 / 3
Регистрация: 15.10.2010
Сообщений: 395
25.11.2010, 14:15 #21
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
#include <iostream>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <conio.h>
 
using namespace std;
 
int main()
{
        int i, j, len;
        char *text = new char[255];
        cout << "Input the text: ";
        cin.getline (text, 255);
        len = strlen (text);
        //cout << len;
        for (i=0; i<len; i++)
                if ((*(text+i) == ' ') && (*(text+i+1) == ' '))
                {
                   //cout << "i = " << i << endl;
                        for (j=i; j<len; j++){
                                *(text+j) = *(text+j+1);
                                }
                                len--;
                                i--;
                }
        cout << "Text is: " << text;
        delete [] text;
        getch();
        return 0;
}
1
goodjob
1 / 1 / 1
Регистрация: 01.04.2013
Сообщений: 73
23.05.2014, 19:09 #22
вот рабочий код, у меня строка считывается из Memo2 и записывается туда же
C++
1
2
3
4
5
6
7
8
  st=Memo2->Lines->Text;
  n=st.Length();
for(r=1;r<n;r++)
    {
if(st[r] == ' ' && st[r+1] == ' ' && st[r+1] != '\0') {for(int j=r;j<n;j++) st[j]=st[j+1]; r=r-1;}
   }
Memo2->Clear();
Memo2->Lines->Add(st);
0
I_am_Max
0 / 0 / 0
Регистрация: 18.05.2014
Сообщений: 6
23.05.2014, 20:19 #23
Вот подходящая тема, может поможет.
Удаление лишних пробелов в строке
0
Magister Yoda
0 / 0 / 0
Регистрация: 24.02.2016
Сообщений: 2
26.08.2016, 18:00 #24
Всё перепробовал, ничего не работает, и вот в инете нарыл функцию которая удаляет пробелы:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
void compactString(char* str) 
{ 
    char* pStr = str; 
    while(*str != '\0') 
    { 
        if(*str != ' ') 
        { 
            *pStr = *str; 
            *pStr++; 
        } 
        str++; 
    } 
    *pStr = '\0'; 
}
0
obivan
26.08.2016, 18:03
  #25

Не по теме:

Magister Yoda, щас бы некропостить в 2016

0
HelicopterK52
660 / 203 / 28
Регистрация: 27.07.2016
Сообщений: 474
Завершенные тесты: 1
26.08.2016, 18:29 #26
Найдите отличие:
Цитата Сообщение от Magister Yoda Посмотреть сообщение
функцию которая удаляет пробелы:
Цитата Сообщение от qwertytol Посмотреть сообщение
удалить все лишние пробелы
Уже видно, что эта функция не решает поставленную задачу.
0
Mr.X
Эксперт С++
3049 / 1694 / 265
Регистрация: 03.05.2010
Сообщений: 3,867
27.08.2016, 10:19 #27
Идиотизм какой-то! Автор требует решения на Си, все отвечающие пишут решения на Си, однако все дружно помечают свою сишню тегом С++ и все это безобразие находится в плюсовом разделе!
Мне кажется, логичнее переместить тему в сишный.
0
Martein
Оператор ЭВМ 6 разряда
673 / 84 / 13
Регистрация: 22.06.2014
Сообщений: 174
27.08.2016, 11:03 #28
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>
#include <vector>
#include <string>
 
int main(int /*argc*/, char** /*argv*/)
{
 
    std::vector<std::string> words;
    std::string word;
    while(std::cin >> word) words.push_back(word);
    for (auto& word : words) std::cout << word << " ";
    return 0;
}
Ввод всего текста заканчивать последовательным нажатием Enter -> Ctrl+Z -> Enter. Это ввод EOF - символа окончания потока строки/файла. Тут мы считываем из потока ввода слова, каждое отдельно в контейнер-вектор. Потом в цикле просто делаем его вывод через пробел. Фактически пробелы присутствуют только при выводе, а в памяти они не хранятся. Задача состоит в том, чтобы найти слова, а не пробелы в тексте.
0
lifeforce
122 / 82 / 19
Регистрация: 27.09.2010
Сообщений: 581
27.08.2016, 11:11 #29
qwertytol,
а не проще так?
C++
1
MoveX->Text = StringReplace(MoveX->Text, "  ", " ", TReplaceFlags() << rfReplaceAll);
то есть два пробела заменить на один во всем тексте.
и если в тексте 3.4.5 ... и тд. пробелов то replace все уровняет до одного пробела.
0
Mr.X
Эксперт С++
3049 / 1694 / 265
Регистрация: 03.05.2010
Сообщений: 3,867
27.08.2016, 13:07 #30
Цитата Сообщение от lifeforce Посмотреть сообщение
а не проще так?
Мне кажется, мой вариант проще, он позволяет заменить на один пробел последовательность любых пробельных символов, а не только пробелов:
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
#include <iostream>
#include <sstream>
#include <string>
///////////////////////////////////////////////////////////////////////////////
typedef std::string     T_str;
///////////////////////////////////////////////////////////////////////////////
T_str   get_normalized_string( T_str    const   &   s )
{
    T_str               res;
    T_str               word;
    std::istringstream  ssin(s);
 
    while( ssin >>  word )
    {
        res     +=  ' ';
        res     +=  word;
    }
 
    res.erase(0, 1);
 
    return  res;
}
///////////////////////////////////////////////////////////////////////////////
int     main()
{
    T_str   s   =   "aaa  bbb\t\t\tccc\n\n\nddd\r\r\reee";
 
    std::cout   <<  s
                <<  std::endl
                <<  std::endl;
 
    std::cout   <<  get_normalized_string( s )
                <<  std::endl;
}
2
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.08.2016, 13:07
Привет! Вот еще темы с ответами:

Строка: удалить лишние пробелы и определить слово с минимальным кол-вом согласных в строке - C++
мое задание : удалить лишние пробелы и определить слово с минимальным кол-вом согласных в строке.... вот моя задача... я удалил лишние...

Удалить лишние пробелы - C++
Вводится строка произвольного текста. Вывести на экран второе слово(слова разделены пробелами) Программа работает, но нужно при вводе...

Удалить лишние пробелы - C++
Сделал програму для удаления лишних пробелов из строки(те что стоят в начале строки, в конце, все кроме одного между словами). Програма...

Удалить все лишние пробелы - C++
В чем ошибка? #include &lt;iostream&gt; #include &lt;string&gt; using namespace std; int main() { string s;


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

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

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