6 / 6 / 2
Регистрация: 20.02.2009
Сообщений: 116
1

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

16.05.2010, 08:35. Показов 70713. Ответов 41
Метки нет (Все метки)

Добрый день. Прошу написать простую программу по заданию: В строке, введённой с клавиатуры, удалить все лишние пробелы.
На форуме толкового ничего не нашел. Заранее благодарю.
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
16.05.2010, 08:35
Ответы с готовыми решениями:

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

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

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

Удалить лишние пробелы в строке
Здравствуйте, не работает код по даной задачке: #include <iostream> #include <string> using...

41
241 / 119 / 14
Регистрация: 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;
}
2
1 / 1 / 0
Регистрация: 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
0 / 0 / 0
Регистрация: 18.05.2014
Сообщений: 6
23.05.2014, 20:19 23
Вот подходящая тема, может поможет.
Удаление лишних пробелов в строке
0
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
825 / 249 / 34
Регистрация: 27.07.2016
Сообщений: 497
Записей в блоге: 1
26.08.2016, 18:29 26
Найдите отличие:
Цитата Сообщение от Magister Yoda Посмотреть сообщение
функцию которая удаляет пробелы:
Цитата Сообщение от qwertytol Посмотреть сообщение
удалить все лишние пробелы
Уже видно, что эта функция не решает поставленную задачу.
0
Эксперт С++
3218 / 1745 / 435
Регистрация: 03.05.2010
Сообщений: 3,867
27.08.2016, 10:19 27
Идиотизм какой-то! Автор требует решения на Си, все отвечающие пишут решения на Си, однако все дружно помечают свою сишню тегом С++ и все это безобразие находится в плюсовом разделе!
Мне кажется, логичнее переместить тему в сишный.
0
691 / 100 / 17
Регистрация: 22.06.2014
Сообщений: 214
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
266 / 211 / 89
Регистрация: 27.09.2010
Сообщений: 1,234
27.08.2016, 11:11 29
qwertytol,
а не проще так?
C++
1
MoveX->Text = StringReplace(MoveX->Text, "  ", " ", TReplaceFlags() << rfReplaceAll);
то есть два пробела заменить на один во всем тексте.
и если в тексте 3.4.5 ... и тд. пробелов то replace все уровняет до одного пробела.
0
Эксперт С++
3218 / 1745 / 435
Регистрация: 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
266 / 211 / 89
Регистрация: 27.09.2010
Сообщений: 1,234
01.09.2016, 07:46 31
Mr.X,
В случае если заменять все символьные пробелы то твой вариант - великолепен.
я предложил только если надо пробелы сократить. - т.е. самый короткий код.
0
825 / 249 / 34
Регистрация: 27.07.2016
Сообщений: 497
Записей в блоге: 1
01.09.2016, 09:38 32
Спёр у модератора Croessmah.
Надеюсь, воровство у модераторов не нарушает правила?
C++
1
2
3
4
5
6
7
8
void Trim_SD(char * dest, char * source){
    for(char *p1=source,*p2=dest; (*p2=*p1);++p1,++p2){
        if(*p1!=' ') continue;
        for(;*p1==' ';++p1);
            p2+=(p2==dest || !(*p1))?0:1;
            *p2=*p1;
    }
}
0
Эксперт С++
3218 / 1745 / 435
Регистрация: 03.05.2010
Сообщений: 3,867
01.09.2016, 10:35 33
HelicopterK52, так це ж на Си!
0
825 / 249 / 34
Регистрация: 27.07.2016
Сообщений: 497
Записей в блоге: 1
01.09.2016, 10:40 34
Цитата Сообщение от Mr.X Посмотреть сообщение
так це ж на Си!
Пусть будет.
0
1550 / 875 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
01.09.2016, 15:29 35
C++
1
2
3
4
5
6
7
8
9
10
11
#include <iostream>
#include <regex>
#include <string>
int main()
{
    std::string s;
    std::getline(std::cin, s);
 
    s = std::regex_replace(s, std::regex("[ ]+"), " ");
    std::cout << s;
}
Если заменять все пробелы (табуляцию и пр.):
C++
1
s = std::regex_replace(s, std::regex("[[:space:]]+"), " ");
0
0 / 0 / 0
Регистрация: 23.11.2015
Сообщений: 6
07.03.2017, 02:53 36
В свое время сталкивался с подобными трудностями.
реализовал через двойной цикл:
C++
1
2
3
4
5
6
        for (int i = 0; i < s.length(); i++)
        {
            if ((s[i] == ' ') && (s[i + 1] == ' '))
                for (int j = i+1; j < s.length(); j++)
                    if (s[j] == ' ') { s.erase(j, 1); j--;}
        }
0
Mournful Max
07.03.2017, 12:14
  #37

Не по теме:

Сейчас бы в 2017, отвечать на тему, созданную в 2010... :D

0
Эксперт CЭксперт С++
5084 / 2269 / 332
Регистрация: 20.02.2013
Сообщений: 5,598
Записей в блоге: 19
07.03.2017, 12:35 38
 Комментарий модератора 
YaPavel, пожалуйста, прочитайте правила форума.
Особое внимание обратите на пункт 4.9 (порядок оформления кода).

.
0
1 / 1 / 0
Регистрация: 06.03.2017
Сообщений: 109
16.10.2017, 20:06 39
Цитата Сообщение от ***GIN*** Посмотреть сообщение
res.push_back(buf[i]);
я думал так только с вектором можно делать
0
2 / 1 / 1
Регистрация: 26.10.2018
Сообщений: 2
26.10.2018, 16:41 40
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
#include<iostream>
#include<string>
using namespace std;
 
string Del(string,char);
 
int main()
{
    int i = 0;
     string str1="Hello my     name            is   Jon";
     string str2;
 
     cout << str1 << endl;
     str2 = Del(str1, ' ');//Поверне: "Hello my name is Jon"
 
    cout<< str2<<endl;
    
    system("pause");
    return 0;
}
string Del(string str,char symvol)
{   
    for (int j = 0; j < str.size(); j++)
    {
        for (int i = 0; i < str.size(); i++)
        {
            if ((str[i] == symvol) && (str[i+1] == symvol))
            {
                str.erase(i, 1);
            }
        }
    }
    return str;
Якщо замість пробілу поставити у виклику функції інший символ то можна видаляти "зайві" символи
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
26.10.2018, 16:41
Помогаю со студенческими работами здесь

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

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

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

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


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru