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

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 104, средняя оценка - 4.69
qwertytol
 Аватар для qwertytol
5 / 5 / 0
Регистрация: 20.02.2009
Сообщений: 116
16.05.2010, 08:35     Удалить лишние пробелы в строке #1
Добрый день. Прошу написать простую программу по заданию: В строке, введённой с клавиатуры, удалить все лишние пробелы.
На форуме толкового ничего не нашел. Заранее благодарю.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
***GIN***
 Аватар для ***GIN***
27 / 27 / 1
Регистрация: 09.04.2010
Сообщений: 60
16.05.2010, 08:42     Удалить лишние пробелы в строке #2
Я не понял ты за халявой здесь? Так иди закажи у себя в городе на заказ? А если нет, то вот тебе совет, буфферизуешь ввод в строку, а дальше цикл по символам, встретил пробел пропустил. а все кроме пробела в другую строку копируешь, это я тебе так, с ходу сказать могу, но это далеко не самый оптимальный способ, найти наиболее оптимальный можно уже отталкиваясь от этого способа.
qwertytol
 Аватар для qwertytol
5 / 5 / 0
Регистрация: 20.02.2009
Сообщений: 116
16.05.2010, 08:52  [ТС]     Удалить лишние пробелы в строке #3
Цитата Сообщение от ***GIN*** Посмотреть сообщение
Я не понял ты за халявой здесь? Так иди закажи у себя в городе на заказ?
Ну если ты не хочешь делать на халяву, прошу пройти мимо. И это не такая уж сложная программа, чтоб делать ее на халяву.

PS: Написал набросок, но он удаляет все пробелы.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
    #include <stdio.h>
    #include <string.h>
int main(){
  char s[250];
  int previos=0, i;
  scanf("%s", s);
  for (i = 0; s[i]; ++i){
      if (!(previos && (s[i] == ' '))){
      putchar(s[i]);
      if (s[i] == ' '){
        previos =1;
      }
    }
  }
    puts(s); 
    }
Sn1pe
11 / 11 / 1
Регистрация: 10.05.2010
Сообщений: 23
16.05.2010, 09:21     Удалить лишние пробелы в строке #4
Вычислить сумму бесконечного сходящегося ряда
Задача №4
qwertytol
 Аватар для qwertytol
5 / 5 / 0
Регистрация: 20.02.2009
Сообщений: 116
16.05.2010, 09:23  [ТС]     Удалить лишние пробелы в строке #5
Спасибо конечно, ну мне нужно проще, чтоб была без функции
Sn1pe
11 / 11 / 1
Регистрация: 10.05.2010
Сообщений: 23
16.05.2010, 09:26     Удалить лишние пробелы в строке #6
Так вместо рекурсии в функции, сделай еще цикл, а саму функцию запихни на место ее вызова и все
Если еще не проходили могу показать как
qwertytol
 Аватар для qwertytol
5 / 5 / 0
Регистрация: 20.02.2009
Сообщений: 116
16.05.2010, 09:34  [ТС]     Удалить лишние пробелы в строке #7
У меня и та программа не работает. Пишет, что нету <vcl.h>, его убираешь, и еще ошибки какие-то. // У меня MS VC++ 6.0

Sn1pe, будь добр, покажи какой там цикл еще добавить
Sn1pe
11 / 11 / 1
Регистрация: 10.05.2010
Сообщений: 23
16.05.2010, 09:45     Удалить лишние пробелы в строке #8
Вместо этого:
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 (j = pos; j < strlen(s)-1; j++)
 {
  s[j]=s[j+1];
}
s[i]=0;}k++;}}
Должно выглядеть примерно так.
nikkka
Мат в 32 хода
 Аватар для nikkka
235 / 170 / 8
Регистрация: 10.09.2009
Сообщений: 1,096
16.05.2010, 09:46     Удалить лишние пробелы в строке #9
Я не понял, что значет "лишние" пробелы?
qwertytol
 Аватар для qwertytol
5 / 5 / 0
Регистрация: 20.02.2009
Сообщений: 116
16.05.2010, 09:47  [ТС]     Удалить лишние пробелы в строке #10
Пробелы..........между...........словами.
nikkka
Мат в 32 хода
 Аватар для nikkka
235 / 170 / 8
Регистрация: 10.09.2009
Сообщений: 1,096
16.05.2010, 09:50     Удалить лишние пробелы в строке #11
А... Что то типо этого?
Вход.:
Я_____очень_____быстро_____ем__.
Выход.:
Я_очень_быстро_ем.
?
qwertytol
 Аватар для qwertytol
5 / 5 / 0
Регистрация: 20.02.2009
Сообщений: 116
16.05.2010, 10:06  [ТС]     Удалить лишние пробелы в строке #12
Да. Можно еще и в начале и конце строки пробелы, но мне это не надо. Между словами хватит

Добавлено через 15 минут
Блин, что-то не работает. Если больше трех пробелов выводит пустую строку, если два пробела выводит не то что надо (один символ до пробела).

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <string.h>
#include <stdio.h>
 
 
   void main() {
    char s[250];  //исходная строка
    
    puts("\nвведите строку");
    gets(s);
    int k=0,i,len,j;
    len=strlen(s);
    for (i=0;i<len;i++)
{ k=i;
while (k!=len)
{ if ((s[k]==' ') && (s[k+1]==' ')) {for (j = 0; j<len-1; j++)
 {
  s[j]=s[j+1];
}
s[i]=0;}k++;}}
 
    puts(s); //выводим результат
    }
***GIN***
 Аватар для ***GIN***
27 / 27 / 1
Регистрация: 09.04.2010
Сообщений: 60
16.05.2010, 10:56     Удалить лишние пробелы в строке #13
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
35
36
37
#include <iostream>
#include <string>
 
using namespace std;
 
 
int main()
{
    string buf;
 
    getline(cin, buf);
    
 
    bool space_sleep = false;
    string res;
    for(int i=0; i<buf.length(); i++)
    {
        if(buf[i]==' ' && space_sleep==true)
        {
            continue;
        }
        if(buf[i]==' ' && space_sleep==false)
        {
            res.push_back(buf[i]);
            space_sleep = true;
        }
        else
        {
            res.push_back(buf[i]);
            space_sleep = false;
        }
    }
    cout<<res;
 
    return 0;
 
}
Это на глаз накидал, за 5 сек, удаляет все до 1 пробела между словами..
Sn1pe
11 / 11 / 1
Регистрация: 10.05.2010
Сообщений: 23
16.05.2010, 11:09     Удалить лишние пробелы в строке #14
Я на глаз, без проверки переводил..
Давно не работал без функций, поэтому где-то ошибся
qwertytol
 Аватар для qwertytol
5 / 5 / 0
Регистрация: 20.02.2009
Сообщений: 116
16.05.2010, 11:12  [ТС]     Удалить лишние пробелы в строке #15
Ошибку пишет:
Код
error C2039:  push_back' : is not a member of 'basic_string<char,struct std::char_traits<char>,class std::allocator<char>
И поясните пожалуйста, что за res.push_back
***GIN***
 Аватар для ***GIN***
27 / 27 / 1
Регистрация: 09.04.2010
Сообщений: 60
16.05.2010, 11:56     Удалить лишние пробелы в строке #16
Зацени, там все есть - <ссылка на форум>

Добавлено через 11 минут
В инете полно инфы про эту ошибку, там вроде как косяк с версией STL еще про это где то в MSDN написано было, в общем ищи дружище, ищи)) и еще подсказка - великий гугл знает все! ну или почти все
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9373 / 5423 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
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 добавить
qwertytol
 Аватар для qwertytol
5 / 5 / 0
Регистрация: 20.02.2009
Сообщений: 116
16.05.2010, 12:22  [ТС]     Удалить лишние пробелы в строке #18
easybudda, Спасибо. Ничего не понятно, но работает.
Было бы лучше, переделать код программы в моих постах. В них хоть немного понимаю.
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];
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.11.2010, 14:11     Удалить лишние пробелы в строке
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
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++;}}
Yandex
Объявления
25.11.2010, 14:11     Удалить лишние пробелы в строке
Ответ Создать тему
Опции темы

Текущее время: 17:33. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru