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

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

Войти
Регистрация
Восстановить пароль
 
Chainik!
1 / 1 / 1
Регистрация: 10.11.2008
Сообщений: 43
#1

Замена группы символов в строке! - C++

28.08.2012, 02:05. Просмотров 967. Ответов 10
Метки нет (Все метки)

Вводится строка, заменить группу более трёх одинаковых символов многоточием(тремя точками).

Например: Helllo woood , должно получится: He...o w...d.

--------------------------------------------------------------------------------------------------------
Что то не так сделал! В чём проблемы??
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
#include "stdafx.h"
#include "iostream"
#include "conio.h"
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
    const int n = 100;
    char s[] = "Hellllo";
    cout << "Stroka imeet vid: " << s;
    for(int i = 0; i < strlen(s); i++)
    {
        int count = 0;
        while(s[i] != s[i + 1])
            i++;
        while(s[i] == s[i + 1])
            i++, count++;
        if(count >= 3)
        {
            for(int j = 1; j <= 3; j++)
                s[j] = '.';
        }
    }
    cout << "\n\nStroka imeet vid: " << s;
    _getch();
    return 0;
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
cactus09
Чайник
69 / 69 / 4
Регистрация: 15.02.2012
Сообщений: 475
28.08.2012, 02:42     Замена группы символов в строке! #2
Может так будет чуточку легче для вашего понимания, а то по моему вы сами запутались в своем коде
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include "iostream"
#include "conio.h"
 
using namespace std;
 
int main()
 {
 char s[] = "HHelllo_woood"; 
 cout << "Stroka imeet vid: " << s;
 
 for(int i = 0; i < (strlen(s)-2); i++){
  if(s[i] == s[i+1] && s[i+1] == s[i+2]){
   for(int j=i;j<i+3;j++){
   s[j] = '.';
   }
  }
 }
 cout << "\n\nStroka imeet vid: " << s;
 getch();
 return 0;
 }
Chainik!
1 / 1 / 1
Регистрация: 10.11.2008
Сообщений: 43
28.08.2012, 03:09  [ТС]     Замена группы символов в строке! #3
Спасибо.

А зачем писать j < i + 3(что значит? мы передвигаемся на 3 символа вперёд?)
Пaтрик
396 / 389 / 38
Регистрация: 21.01.2012
Сообщений: 972
Завершенные тесты: 1
28.08.2012, 09:35     Замена группы символов в строке! #4
C++
1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>
#include <string>
 
int main()
{
   std::string str = "Helllo woood";
   int len = str.size();
   for(int i = 0; i < len - 3; i++)
      if (str[i] == str[i + 1] && str[i + 1] == str[i + 2])
         str[i] = str[i + 1] = str[i + 2] = '.';
   std::cout << str << std::endl;
}
link
Кот Ангенс
317 / 267 / 38
Регистрация: 24.05.2012
Сообщений: 629
28.08.2012, 09:59     Замена группы символов в строке! #5
cactus09, ваша программа некорректно работает при наличии более трех одинаковых символов подряд.
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
#include <stdio.h>
 
char* rem3same(char s[ ]) {
    unsigned iread = 0, iwrite = 0, i;
    char c = '\0';
    while (s[iread]) {
        if (c == s[iread]) {
            i = iread;
            while (c == s[iread]) { iread++; }
            if (!s[iread]) {
                s[iwrite++] = c;
                break;
            }
            if (iread - i > 1) {
                s[iwrite - 1] = s[iwrite] = s[iwrite + 1] = '.';
                iwrite++;
            }
            iwrite++;
        }
        c = s[iwrite++] = s[iread++];
    }
    s[iwrite] = '\0';
    return s;
}
 
int main() {
    char s[ ] = "HHellooo Woooorlddddd!11";
    puts(s);
    rem3same(s);
    puts(s);
    getchar();
}
Добавлено через 1 минуту
Пaтрик, ваша тоже.
igorrr37
1636 / 1264 / 129
Регистрация: 21.12.2010
Сообщений: 1,927
Записей в блоге: 7
28.08.2012, 10:06     Замена группы символов в строке! #6
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 <iostream>
#include <cstring>
 
int main()
{
    char s[] = "HHHHeeeelllo, woooooo..rrrldddd!", *a = s, *b = s, *c = s;
    size_t repN(3); // заменяем 3 и более
    for(a = s, b = s, c = s; *a; )
    {
        for(; *a == *b; ++b)
            ;
        if(static_cast<std::size_t>(b - a) >= repN)
        {
            c = a;
            for(; b != a; ++a)
            {
                *a = '.';
            }
            std::memmove(c + repN, b, std::strlen(b) + 1);
            b = a = c + repN;
        }
        else
            a = b;
    }
    std::cout << s << std::endl;
    return 0;
}
salam
157 / 138 / 11
Регистрация: 10.07.2012
Сообщений: 709
28.08.2012, 11:09     Замена группы символов в строке! #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
24
25
26
int main()
{
    int num;
    string str;
    cin >> num;
    cin.ignore(1);
    getline(cin, str);
    vector <int> v(str.length(), 1);
    for(int i=1; i < str.length(); i++)
        if(str[i] == str[i-1])
            v[i] = v[i-1] + 1;
    for(int i=str.length()-1; i >= 0; i--)
        if(v[i] > num)
        {
            size_t st = i;
            size_t end = i;
            while(st != -1 && v[st] != 1)
                st--;
            str.erase(st, end-st+1);
            str.insert(st, "...");
            i = st;
        }
    cout << str << endl;
    system("pause");
    return 0;
}
Mиxaил
531 / 436 / 37
Регистрация: 10.12.2009
Сообщений: 1,857
28.08.2012, 12:38     Замена группы символов в строке! #8
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
#include <iostream>
#include <string>
 
int main()
{
    std::string str( "Heelllllo, wwwwwwworlddd" );
 
    size_t index = 1, j, count;
 
    while( index < str.size() )
    {
        count = 1;
        j = index;
        while ( str[ j ] == str[ j - 1 ] )
        {
            count++;
            j++;
        }
        if ( count >= 3 )
        {
            index--;
            str.erase( index, count );
            str.insert( index, "..." );
            index += 2;
        }
        index++;
    }
 
    std::cout << "Result: " << str << std::endl;
 
    return 0;
}
cactus09
Чайник
69 / 69 / 4
Регистрация: 15.02.2012
Сообщений: 475
28.08.2012, 16:58     Замена группы символов в строке! #9
Цитата Сообщение от Chainik! Посмотреть сообщение
А зачем писать j < i + 3(что значит? мы передвигаемся на 3 символа вперёд?)
Ну это значит то что заменяются на точки все символы на протяжении от j до j+2(тоесть 3 символа).

Цитата Сообщение от Кот Ангенс Посмотреть сообщение
cactus09, ваша программа некорректно работает при наличии более трех одинаковых символов подряд.
Признаю, как-то не подумал
Chainik!
1 / 1 / 1
Регистрация: 10.11.2008
Сообщений: 43
05.09.2012, 04:30  [ТС]     Замена группы символов в строке! #10
Спасибо
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.09.2012, 09:36     Замена группы символов в строке!
Еще ссылки по теме:

Замена символов в строке C++
Замена символов в строке C++
Замена символов в строке C++
C++ Замена символов в строке с while
C++ Замена группы символов одним

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

Или воспользуйтесь поиском по форуму:
Mr.X
Эксперт С++
3040 / 1685 / 265
Регистрация: 03.05.2010
Сообщений: 3,867
05.09.2012, 09:36     Замена группы символов в строке! #11
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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
/////////////////////////////////////////////////////////////////////////////////////////
#include <iostream>
#include <numeric>
#include <string>
#include <vector>
/////////////////////////////////////////////////////////////////////////////////////////
typedef std::string     T_str;
/////////////////////////////////////////////////////////////////////////////////////////
void  to_replace_not_smaller_than_n_identical_symbols_with_ellipsis
    (
        int     n,
        T_str&  s
    )
{    
    T_str   adj_diff_str(s);
    std::adjacent_difference
        (
            s.begin(),
            s.end(),
            adj_diff_str.begin()
        );
    
    T_str::size_type    zero_arr_begin_pos  =   s.size() - 1;
    T_str::size_type    zero_arr_end_pos    =   s.size() - 1;
 
    const char  SYMBOL_WITH_ZERO_VALUE      =   0;
    const T_str ELLIPSIS_STR                =   "...";
 
    while
        (
                (
                    zero_arr_end_pos   =   adj_diff_str.find_last_of       
                                                (
                                                    SYMBOL_WITH_ZERO_VALUE,
                                                    zero_arr_begin_pos
                                                )            
                )    
            !=  T_str::npos
        )
    {
        zero_arr_begin_pos  =   adj_diff_str.find_last_not_of
                                    (
                                        SYMBOL_WITH_ZERO_VALUE,
                                        zero_arr_end_pos                                        
                                    );
 
        int     quantity_of_identical_symbols   =   zero_arr_end_pos - zero_arr_begin_pos + 1;        
 
        if( quantity_of_identical_symbols >= n )
        {
            s.replace
                (
                    zero_arr_begin_pos,
                    quantity_of_identical_symbols,
                    ELLIPSIS_STR                    
                );        
        }        
    }//while    
}
/////////////////////////////////////////////////////////////////////////////////////////
int main()
{
    T_str   s   =   "a1b22c333d4444e55555f666666g7777777h88888888i999999999";
    std::cout   <<  s
                <<  std::endl;
 
    to_replace_not_smaller_than_n_identical_symbols_with_ellipsis
        (
            3,
            s
        );
 
    std::cout   <<  s
                <<  std::endl;
}
Yandex
Объявления
05.09.2012, 09:36     Замена группы символов в строке!
Ответ Создать тему
Опции темы

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