15 / 15 / 3
Регистрация: 03.07.2012
Сообщений: 350
1

Удалить из строки символы * и удвоить остальные

07.03.2017, 22:02. Показов 3491. Ответов 14
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет. Есть задачка: Дана строка. Преобразовать ее, удалив каждый символ * и повторив каждый символ, отличный от *.
Так вот, сделать я её сделал, только проблема одна. Как я понял, удалить символ нельзя со строки, но можно сдвинуть. Сдвинуть влево, получается, нужно на количество звездочек, то есть нужен счетчик этих звездочек. Но не обнуляется счетчик, помогите.

Вот код ( громоздкий, не ругайте, что можно было проще ) :
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
#include <iostream>
#include <cstring>
 
using namespace std;
 
int main ()
{
    char str[100];
    char ds[100];
    cout << "Vvedite ctroky: ";
    cin.getline(str, 100);
 
    int l = strlen(str);
    char symbol = '*';
 
 
for(int i = 0; i < l; i++)
 
{
        int cnt = 0;
 
        if (str[i] == symbol) 
            {
 
               for ( int v=i; v<l; v++ )
               {
                   if (str[v] == symbol) 
                   cnt++;
               }
                
 
                for(int j=i; j<l; j++)
                str[j] = str[j+cnt]; 
 
            } 
 
        else  
                    
            {
                int count=0;
                for(int g=0; g<l ;g++)
 
                { 
                ds[count]=str[g];
                count++;
 
                ds[count]=str[g];
                count++;
                }
 
                ds[count]='\0';
 
             }
 
        cnt = 0;
}
 
cout << ds;
 
    return 0;
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
07.03.2017, 22:02
Ответы с готовыми решениями:

Дана строка символов. Удалить из строки символы '*', а остальные удвоить
3)Дана строка символов. Удалить из строки символы '*' , а остальные удвоить. Заранее спасибо!!!

Удалить из данной последовательности символов все группы букв вида abсd и удвоить остальные символы
Дано n символов. Удалить из данной последовательности все группы букв вида abсd и удвоить...

Все символы «пробел» удаляются из исходной строки, остальные символы – копируются
Все символы «пробел» удаляются из исходной строки, остальные символы – копируются. Помогите...

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

14
Модератор
Эксперт С++
13412 / 10522 / 6285
Регистрация: 18.12.2011
Сообщений: 28,099
07.03.2017, 22:09 2
Сделайте проще - сразу пишите результат в другую строку,
C++
1
2
3
4
5
6
7
8
9
 int L = strlen(str);
int k=0;
for(int i=0;i<L;i++)
  if(src[i]!='*')
  {
       dst[k++]=src[i];
       dst[k++]=src[i];
  }
dst[k]=0;
0
63 / 63 / 39
Регистрация: 18.11.2016
Сообщений: 562
07.03.2017, 22:14 3
Прекрасно удаляется.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
int main(){
    SetConsoleCP (1251);
    SetConsoleOutputCP (1251);
 
    std::string str_1 = "Hello this world";
 
    std::cout << str_1 << std::endl;
 
    for (int i(0); str_1[i]; i++){
        if (str_1[i] == ' ')
            str_1.erase (i, 1);
    }
 
    std::cout << str_1 << std::endl;
    
 
    system ("pause");
    return 0;
}
0
15 / 15 / 3
Регистрация: 03.07.2012
Сообщений: 350
07.03.2017, 22:21  [ТС] 4
Цитата Сообщение от Photofenix Посмотреть сообщение
Прекрасно удаляется.
у меня char , а не string

Добавлено через 2 минуты
Цитата Сообщение от zss Посмотреть сообщение
Сделайте проще - сразу пишите результат в другую строку,
спасибо конечно, но что насчет "*" и счетчика. Может я где-то допустил глупую ошибку, не знаю.
0
63 / 63 / 39
Регистрация: 18.11.2016
Сообщений: 562
07.03.2017, 22:36 5
В задании обязательно делать символьный массив? Может все же string?
0
15 / 15 / 3
Регистрация: 03.07.2012
Сообщений: 350
07.03.2017, 23:25  [ТС] 6
Цитата Сообщение от Photofenix Посмотреть сообщение
В задании обязательно делать символьный массив? Может все же string?
да вроде нет Но если я буду переписывать под string, я долго буду это делать(

Добавлено через 21 минуту
Если всё же в string писать, то надо std::cout и всё остальное писать?

Добавлено через 14 минут
Попытался написать в string, удаляет только одну звездочку, а вдруг их там 2, 3 или больше..
0
63 / 63 / 39
Регистрация: 18.11.2016
Сообщений: 562
07.03.2017, 23:35 7
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
int main (){
    SetConsoleCP (1251);
    SetConsoleOutputCP (1251);
 
    std::string str_1 = "Hello th*is wor*d, you ar* so be*au*ti*ful";
    std::string str_2;
 
    std::cout << str_1 << std::endl;
 
    for (int i(0); str_1[i]; i++){
        if (str_1[i] == '*')
            str_1.erase (i, 1); // (i, 1) - удаляем символ под индексом i, 1 означает, что удаляем один символ.
    }
    
    std::cout << str_1 << std::endl;
 
    system ("pause");
    return 0;
}
Далее я думаю, можно дважды скопировать каждый символ в строку два. Как это сделать, я думаю, вы сможете спросить на форуме
0
Эксперт .NET
5868 / 4745 / 2940
Регистрация: 20.04.2015
Сообщений: 8,361
07.03.2017, 23:38 8
Цитата Сообщение от Jenykl Посмотреть сообщение
всё остальное писать?
Да:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
#include <string>
int main()
{
    std::string str;
    std::cout << "Enter string:";
    std::cin >> str;
    std::size_t index = str.size()-1;
    do
    {
        if(str[index]=='*')
            str.erase(index, 1);
        else
            str.insert(index, 1, str[index]);
    }
    while(index-->0);
    std::cout << str;
    return 0;
}
0
15 / 15 / 3
Регистрация: 03.07.2012
Сообщений: 350
07.03.2017, 23:54  [ТС] 9
Цитата Сообщение от Даценд Посмотреть сообщение
std::size_t index = str.size()-1;
size_t - возвращает длину строки, а str.size()-1 что делает? Буду благодарен, если поясните)
0
Эксперт .NET
5868 / 4745 / 2940
Регистрация: 20.04.2015
Сообщений: 8,361
07.03.2017, 23:58 10
Цитата Сообщение от Jenykl Посмотреть сообщение
size_t - возвращает длину строки, а str.size()-1 что делает?
size_t - тип данных, беззнаковый целый.
Длину строки возвращает функция size().
А str.size()-1 - это индекс последнего символа строки.
0
15 / 15 / 3
Регистрация: 03.07.2012
Сообщений: 350
08.03.2017, 00:03  [ТС] 11
Цитата Сообщение от Даценд Посмотреть сообщение
while(index-->0);
И еще, "-->" означает "стремится к нулю?" Не встречал пока такого)
0
141 / 119 / 29
Регистрация: 12.02.2017
Сообщений: 308
08.03.2017, 00:07 12
index-->0 - это постфиксный декремент index'а, который сравнивается с 0
0
15 / 15 / 3
Регистрация: 03.07.2012
Сообщений: 350
08.03.2017, 00:16  [ТС] 13
Спасибо большое всем, с утреца более подробно разберусь, сейчас уже не могу(
0
Модератор
Эксперт С++
13412 / 10522 / 6285
Регистрация: 18.12.2011
Сообщений: 28,099
08.03.2017, 09:08 14
Цитата Сообщение от Jenykl Посмотреть сообщение
но что насчет "*" и счетчика
Звездочки просто пропускаем, а счетчик - это переменная k
0
15 / 15 / 3
Регистрация: 03.07.2012
Сообщений: 350
08.03.2017, 10:34  [ТС] 15
Ура, я понял, что не так.
Поменял это :
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
for(int i = 0; i < l; i++)
 
{
        int cnt = 0;
 
        if (str[i] == symbol) 
            {
 
               for ( int v=i; v<l; v++ )
               {
                   if (str[v] == symbol) 
                   cnt++;
               }
                
 
                for(int j=i; j<l; j++)
                str[j] = str[j+cnt]; 
 
            }
на это(перенес счетчик звездочек в начало главного цикла,и убрал лишний цикл, не знаю, зачем я его поставил туда?):

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
for(int i = 0; i < l; i++)
 
{
        int cnt = 0;
 
       
                   if (str[i] == symbol) 
                   cnt++; 
               
 
        if (str[i] == symbol) 
 
            {
 
                for(int j=i; j<l; j++)
                {
                    str[j] = str[j+cnt]; 
                }
 
            
            }
Добавлено через 27 минут
Вот окончательный код, рабочий:
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
#include <iostream>
#include <cstring>
 
using namespace std;
 
int main ()
{
    char str[100];
    char ds[100];
    cout << "Vvedite ctroky: ";
    cin.getline(str, 100);
 
    int l = strlen(str);
    char symbol = '*';
 
for(int i = 0; i < l; i++)
 
{
    int cnt = 0;
 
        if (str[i] == symbol) 
 
            {
            cnt++; 
            }
               
            if (str[i] == symbol) 
 
                {
 
                    for(int j=i; j<l; j++)
 
                    {
                        str[j] = str[j+cnt]; 
                    }
            
            } 
 
                int k=0;
 
                    for(int i=0;i<l;i++)
 
                        if( str[i] != symbol )
 
                             {
                                ds[k++]=str[i];
                                ds[k++]=str[i];
                             }
 
                  ds[k]=0;
}
 
cout << ds << endl;
 
    return 0;
}
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
08.03.2017, 10:34
Помогаю со студенческими работами здесь

В заданном тексте удалить все цифры (остальные символы оставить неизменными)
эту программу нужно написать по теме :Обработка строковых данных в языке программирования Pascal

В данном тексте удалить каждый символ * и повторить все остальные символы
В данном тексте удалить каждый символ * и повторить все остальные символы.

В строке удвоить символы. Удвоить строку. 2 разные программы
В строке удвоить символы. Удвоить строку. 2 разные программы

Дано целое число K и текстовый файл. Удалить из каждой строки файла первые K символов (если длина строки меньше K, то удалить из нее все символы)
Помогите Пожалуйста написать программу! Дано целое число K и текстовый файл. Удалить из каждой...

Считывать длину строки (только буквы, остальные символы не считаются)
Задача такая: нужно написать программу, которая будет считывать длину строки (только буквы,...

Удалить все символы "*", а символы, не являющиеся "*", удвоить
Составить программу, которая вводит строку символов, выполняет ее обработку и затем выво- дит...


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

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

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