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

Лишние пробелы - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 8, средняя оценка - 4.75
timofei580
0 / 0 / 0
Регистрация: 15.10.2011
Сообщений: 23
29.11.2011, 19:57     Лишние пробелы #1
Здравствуйте. Выполняю задание на microsoft visual studio. Необходимо удалить лишние пробелы в строке, используя массив и нельзя использовать стандартные функции удаления. Вот код. Почему-то не работает.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include "stdafx.h"
#include <string.h>
#include <math.h>
#include <iostream>
#include <stdio.h>
#include <conio.h>
using namespace std;
 
int main ()
{char s[100];
int i,k;
cin>>s;
k=strlen(s);
for(i=0;i<k;i++)
    if ((s[i]==char(" "))&&(s[i+1]==char(" "))) 
        {for(i=s[i];i<k-1;i++) 
             {s[i]=s[i+1]; 
              k=k-1;}}
puts(s);
getch();    
return 0;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.11.2011, 19:57     Лишние пробелы
Посмотрите здесь:

C++ Удалить из текста лишние пробелы
Удалить лишние пробелы C++
C++ Убрать лишние пробелы
Удалить лишние пробелы C++
Удалить все лишние пробелы C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Сыроежка
Заблокирован
29.11.2011, 20:04     Лишние пробелы #2
timofei580,

У вас этот код

C++
1
        if ((s[i]==char(" "))&&(s[i+1]==char(" ")))
некорректный. Вы пытаетесь указатель на символь, то есть const char * преобразовать в тип char

Надо написать просто

C++
1
        if ( ( s[i] == ' ' ) && ( s[i+1] == ' ' ) )
timofei580
0 / 0 / 0
Регистрация: 15.10.2011
Сообщений: 23
29.11.2011, 20:10  [ТС]     Лишние пробелы #3
Цитата Сообщение от Сыроежка Посмотреть сообщение
timofei580,

У вас этот код

C++
1
        if ((s[i]==char(" "))&&(s[i+1]==char(" ")))
некорректный. Вы пытаетесь указатель на символь, то есть const char * преобразовать в тип char

Надо написать просто

C++
1
        if ( ( s[i] == ' ' ) && ( s[i+1] == ' ' ) )
Почему то программа выводит только первое слово или букву...
aeshes
 Аватар для aeshes
437 / 200 / 13
Регистрация: 07.10.2011
Сообщений: 462
29.11.2011, 20:13     Лишние пробелы #4
C++
1
cin>>s;
cin не читает строку с пробелами (читает до первого пробела), поэтому его нельзя здесь использовать
попробуйте другие способы ввода строки, например, getline
Сыроежка
Заблокирован
29.11.2011, 20:15     Лишние пробелы #5
Цитата Сообщение от timofei580 Посмотреть сообщение
Почему то программа выводит только первое слово или букву...
Потому что весь этот код

C++
1
2
3
4
5
for(i=0;i<k;i++)
        if ((s[i]==char(" "))&&(s[i+1]==char(" "))) 
            {for(i=s[i];i<k-1;i++) 
                     {s[i]=s[i+1]; 
              k=k-1;}}
неверный!
timofei580
0 / 0 / 0
Регистрация: 15.10.2011
Сообщений: 23
29.11.2011, 20:20  [ТС]     Лишние пробелы #6
Когда стал использовать gets. Стал выводить просто ту же самую строку...
aeshes
 Аватар для aeshes
437 / 200 / 13
Регистрация: 07.10.2011
Сообщений: 462
29.11.2011, 21:20     Лишние пробелы #7
вот так попробуй
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
#include <conio.h>
using namespace std;
 
int main ()
{
    char s[100];
    int i,k;
    cin.getline(s,99);
    k=strlen(s);
    for(i=0;i<=k;i++)
        if ((s[i]==' ')&&(s[i+1]==' ')) 
        {
            for(int j=i;j<k;j++) 
            {
                s[j]=s[j+1]; 
            }
            k--;    
        }
    cout<<s;
    getch();        
    return 0;
}
Thinker
Эксперт C++
 Аватар для Thinker
4215 / 2189 / 150
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
29.11.2011, 21:27     Лишние пробелы #8
Цитата Сообщение от aeshes Посмотреть сообщение
вот так попробуй
Сложность этого алгоритма O(n^2). Можно за O(n)
BRcr
 Аватар для BRcr
4003 / 2292 / 155
Регистрация: 03.02.2011
Сообщений: 5,064
Записей в блоге: 10
29.11.2011, 21:45     Лишние пробелы #9
Цитата Сообщение от Thinker Посмотреть сообщение
Сложность этого алгоритма O(n^2). Можно за O(n)
Как? После нахождения пробела в строке определять, сколько их всего идет подряд?
Thinker
Эксперт C++
 Аватар для Thinker
4215 / 2189 / 150
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
29.11.2011, 21:50     Лишние пробелы #10
Цитата Сообщение от BRcr Посмотреть сообщение
Как? После нахождения пробела в строке определять, сколько их всего идет подряд?
Здесь не подряд идущие пробелы играют роль, а внутренний цикл со сдвигами на сложность алгоритма Помните пример расчета сложности похожего алгоритма я приводил в топике с удалением элементов из массива.
BRcr
 Аватар для BRcr
4003 / 2292 / 155
Регистрация: 03.02.2011
Сообщений: 5,064
Записей в блоге: 10
29.11.2011, 22:10     Лишние пробелы #11
Цитата Сообщение от Thinker Посмотреть сообщение
внутренний цикл со сдвигами
да-да...
Тогда так: нашли второй в ряд пробел, запомнили его позицию. Ищем дальше в строчке первый символ, пробелом не являющийся, и пишем его в запомненную на первом шаге позицию. Далее просто записываем все следующие символы подряд до следующего пробела, инкрементируя позицию записи. Далее при встрече пробела пишем и его, надо ж по одному оставить, и опять начинаем искать следующий не пустой символ для записи.
Дык, это ж, по сути, алгоритм простейшего случая дефрагментации!
Thinker
Эксперт C++
 Аватар для Thinker
4215 / 2189 / 150
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
29.11.2011, 22:17     Лишние пробелы #12
Цитата Сообщение от BRcr Посмотреть сообщение
да-да...
Тогда так: нашли второй в ряд пробел, запомнили его позицию. Ищем дальше в строчке первый символ, пробелом не являющийся, и пишем его в запомненную на первом шаге позицию. Далее просто записываем все следующие символы подряд до следующего пробела, инкрементируя позицию записи. Далее при встрече пробела пишем и его, надо ж по одному оставить, и опять начинаем искать следующий не пустой символ для записи.
Дык, это ж, по сути, алгоритм простейшего случая дефрагментации!
Вот, другое дело, сложность данного алгоритма не более длины строки, о чем я и говорил, то есть пробегать по серии подряд идущих пробелов и только один записывать, а потом по серии не пробелов и записывать все элементы данной серии
sire
 Аватар для sire
25 / 25 / 2
Регистрация: 01.05.2011
Сообщений: 143
15.03.2012, 16:07     Лишние пробелы #13
Что бы не создавать лишний топик. вот 'создаю' и застрял.
Чего дальше то? Подскажите как обставить. Токо попроше плиз без наворотов

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <stdio.h>
 
 
int main ()
{
    char string[128];
    int  probel=0,i;
 
    printf("string: ");
    scanf("%[^\n]",string);
    for(i=0; string[i]; i++)
        if (string[i]==' ')
            ++probel;
if(probel>1)
// И чего дальше? Если оно больше одного
    printf("string: %s\n", string);
    printf("probelov: %i", probel);
    return 0;
}
BRcr
 Аватар для BRcr
4003 / 2292 / 155
Регистрация: 03.02.2011
Сообщений: 5,064
Записей в блоге: 10
15.03.2012, 19:07     Лишние пробелы #14
Цитата Сообщение от sire Посмотреть сообщение
Чего дальше то?
Как у вас дальше - не знаю. Но в общем как-то так, примерно:
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
    char str[128], res[128] = {'\0'};
    int sp_cnt = 0, rem_sps = 0, cur_pos = 0, i;
 
    strcpy( str, "   The     test  string "
        "with    a multiple                  spaces" );
    for ( i = 0; str[i]; i++ ) {
        if ( str[i] == ' ' ) {
            // проверка cur_pos устраняет возможность записи пробела
            // первым символом в результирующей строке
            if ( !sp_cnt && cur_pos ) {
                res[cur_pos] = str[i];
                cur_pos++;
            }
            sp_cnt++;
        }
        else {
            if ( sp_cnt ) {
                if ( cur_pos ) {
                    rem_sps += sp_cnt - 1;
                }
                else {
                    rem_sps += sp_cnt;
                }
            }
            sp_cnt = 0;
            res[cur_pos] = str[i];
            cur_pos++;
        }
    }
    printf( "Starting string:\n%s\n\n"
        "Formatted string:\n%s\n\n"
        "Removed spaces count = %i\n", str, res, rem_sps );
 
    system( "pause" );
    return 0;
Вывод кода.
sire
 Аватар для sire
25 / 25 / 2
Регистрация: 01.05.2011
Сообщений: 143
15.03.2012, 19:26     Лишние пробелы #15
О_о можно как то обозвать эти переменные , попонятней плиз. И так голова кругом
BRcr
 Аватар для BRcr
4003 / 2292 / 155
Регистрация: 03.02.2011
Сообщений: 5,064
Записей в блоге: 10
15.03.2012, 19:47     Лишние пробелы #16
str - string - строка
res - result - результат
sp_cnt - spaces count - счетчик пробелов
rem_sps - removed spaces - удаленных пробелов
cur_pos - current position - текущая позиция(индекс)
Напрасно вы так - аглицкий для программирования в обязательном порядке.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.03.2012, 19:51     Лишние пробелы
Еще ссылки по теме:

Удалить лишние пробелы в строке C++
Лишние пробелы в начале строки C++
Программа, удаляющая лишние пробелы C++

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

Или воспользуйтесь поиском по форуму:
sire
 Аватар для sire
25 / 25 / 2
Регистрация: 01.05.2011
Сообщений: 143
15.03.2012, 19:51     Лишние пробелы #17
Спасибо с английским порядок. Просто сокращения добавляют головной боли. Пойду разбираться в логике.
Yandex
Объявления
15.03.2012, 19:51     Лишние пробелы
Ответ Создать тему
Опции темы

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