Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.56/18: Рейтинг темы: голосов - 18, средняя оценка - 4.56
0 / 0 / 0
Регистрация: 15.10.2011
Сообщений: 23
1

Лишние пробелы

29.11.2011, 19:57. Показов 3464. Ответов 16
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте. Выполняю задание на 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;
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
29.11.2011, 19:57
Ответы с готовыми решениями:

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

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

Удалить лишние пробелы
Вводится строка произвольного текста. Вывести на экран второе слово(слова разделены пробелами)...

Убрать лишние пробелы
отформотировать строку 1)убрать все лишние пробелы 2) убрать 1 пробел после знака препинания ...

16
Заблокирован
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] == ' ' ) )
0
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] == ' ' ) )
Почему то программа выводит только первое слово или букву...
0
448 / 211 / 21
Регистрация: 07.10.2011
Сообщений: 462
29.11.2011, 20:13 4
C++
1
cin>>s;
cin не читает строку с пробелами (читает до первого пробела), поэтому его нельзя здесь использовать
попробуйте другие способы ввода строки, например, getline
0
Заблокирован
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;}}
неверный!
0
0 / 0 / 0
Регистрация: 15.10.2011
Сообщений: 23
29.11.2011, 20:20  [ТС] 6
Когда стал использовать gets. Стал выводить просто ту же самую строку...
0
448 / 211 / 21
Регистрация: 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;
}
0
Эксперт С++
4267 / 2241 / 203
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
29.11.2011, 21:27 8
Цитата Сообщение от aeshes Посмотреть сообщение
вот так попробуй
Сложность этого алгоритма O(n^2). Можно за O(n)
0
4043 / 2332 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
29.11.2011, 21:45 9
Цитата Сообщение от Thinker Посмотреть сообщение
Сложность этого алгоритма O(n^2). Можно за O(n)
Как? После нахождения пробела в строке определять, сколько их всего идет подряд?
0
Эксперт С++
4267 / 2241 / 203
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
29.11.2011, 21:50 10
Цитата Сообщение от BRcr Посмотреть сообщение
Как? После нахождения пробела в строке определять, сколько их всего идет подряд?
Здесь не подряд идущие пробелы играют роль, а внутренний цикл со сдвигами на сложность алгоритма Помните пример расчета сложности похожего алгоритма я приводил в топике с удалением элементов из массива.
0
4043 / 2332 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
29.11.2011, 22:10 11
Цитата Сообщение от Thinker Посмотреть сообщение
внутренний цикл со сдвигами
да-да...
Тогда так: нашли второй в ряд пробел, запомнили его позицию. Ищем дальше в строчке первый символ, пробелом не являющийся, и пишем его в запомненную на первом шаге позицию. Далее просто записываем все следующие символы подряд до следующего пробела, инкрементируя позицию записи. Далее при встрече пробела пишем и его, надо ж по одному оставить, и опять начинаем искать следующий не пустой символ для записи.
Дык, это ж, по сути, алгоритм простейшего случая дефрагментации!
0
Эксперт С++
4267 / 2241 / 203
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
29.11.2011, 22:17 12
Цитата Сообщение от BRcr Посмотреть сообщение
да-да...
Тогда так: нашли второй в ряд пробел, запомнили его позицию. Ищем дальше в строчке первый символ, пробелом не являющийся, и пишем его в запомненную на первом шаге позицию. Далее просто записываем все следующие символы подряд до следующего пробела, инкрементируя позицию записи. Далее при встрече пробела пишем и его, надо ж по одному оставить, и опять начинаем искать следующий не пустой символ для записи.
Дык, это ж, по сути, алгоритм простейшего случая дефрагментации!
Вот, другое дело, сложность данного алгоритма не более длины строки, о чем я и говорил, то есть пробегать по серии подряд идущих пробелов и только один записывать, а потом по серии не пробелов и записывать все элементы данной серии
0
25 / 25 / 1
Регистрация: 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;
}
0
4043 / 2332 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 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;
Вывод кода.
1
25 / 25 / 1
Регистрация: 01.05.2011
Сообщений: 143
15.03.2012, 19:26 15
О_о можно как то обозвать эти переменные , попонятней плиз. И так голова кругом
0
4043 / 2332 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
15.03.2012, 19:47 16
str - string - строка
res - result - результат
sp_cnt - spaces count - счетчик пробелов
rem_sps - removed spaces - удаленных пробелов
cur_pos - current position - текущая позиция(индекс)
Напрасно вы так - аглицкий для программирования в обязательном порядке.
1
25 / 25 / 1
Регистрация: 01.05.2011
Сообщений: 143
15.03.2012, 19:51 17
Спасибо с английским порядок. Просто сокращения добавляют головной боли. Пойду разбираться в логике.
0
15.03.2012, 19:51
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
15.03.2012, 19:51
Помогаю со студенческими работами здесь

Лишние пробелы в начале строки
void prog(FILE *input,FILE *output) { char s; char p; while(fgets(s,256,input)!=NULL) { ...

Удалить из текста лишние пробелы
Здравствуйте. Помогите написатьпрограмму на С. Удалить из текста лишние пробелы (между словами...

Убрать лишние пробелы в строке
дана строка-предложение с избыточными пробелами между словами. Преобразовать ее так чтобы между...

Удалить лишние пробелы в строке
Добрый день. Прошу написать простую программу по заданию: В строке, введённой с клавиатуры, удалить...

Удалить лишние пробелы из строки
Задана строка из массива символов. Нужно удалить лишние пробелы: Пробелы в начале и конце теста и...

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


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

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru