Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

Войти
Регистрация
Восстановить пароль
 
Lahden
1 / 1 / 0
Регистрация: 26.09.2013
Сообщений: 52
#1

Обработать строку, используя указатели - C++

09.11.2013, 19:42. Просмотров 369. Ответов 9
Метки нет (Все метки)

Условие обработки:
Удалить последоватьльность из двух и более символов, эквивалентных заданной цифре.

Если после последовательность стоят еще другие цыфры или буквы, то их тоже почему то удаляет, помогите исправить
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
#include "work_4.h"
#include <iostream>
#include <cstring>
using namespace std;
 
int main()
{
    char* pTmp;
    char tmp [80];
    char digit;
    cout << "Enter digit, please -> " << endl;
    cin >> digit;
    cout << "Enter string, please -> ";
    do
    {
        cin.getline (tmp,80);
        pTmp = new char [strlen(tmp)+1];
        strcpy_s (pTmp, strlen(tmp)+1,tmp);
        char* pS = pTmp;
        while (*pS != '\0')
        {
            if(*pS == digit && *(pS+1)== digit)
            {
                *pS='\0';
                *(pS+1)='\0';
            }
            pS++;
        }
        cout << pTmp << endl;
        delete [] pTmp;
    }while(strlen(tmp)%2==0);
    return 0;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.11.2013, 19:42
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Обработать строку, используя указатели (C++):

Разделить строку на слова, используя указатели - C++
Помогите, пожалуйста, сделать программу. Ввести произвольное предложение с клавиатуры, слова отделяются пробелами. Вывести это...

Написать программу копирования строки T в строку S, используя указатели. - C++
Написать программу копирования строки T в строку S, используя указатели. В головной функции напечатать строку T.

Есть три переменные. Используя указатели на указатели, поменять значение максимальной и минимальной переменной - C++
Мой код. #include &lt;iostream&gt; #include &lt;stdlib.h&gt; #include&lt;iomanip&gt; using namespace std; void min_max(int*pa, int*pb,...

Используя динамический массив, обработать элементы - C++
Дан массив целых чисел из n элементов. Удалить из него все элементы, в записи которых последняя цифра равна 0.

Используя динамические массивы, обработать элементы одномерного массива - C++
. Дан массив целых чисел из n элементов. Выведите массив на экран. Найти произведение четных элементов, значения которых по модулю меньше...

Ввести с клавиатуры строку символов и обработать ее - C++
Здравствуйте! помогите пожалуйста со строками в С++! Ввести с клавиатуры строку символов и обработать ее в соответствии со своим...

9
zss
Модератор
Эксперт С++
6575 / 6137 / 2021
Регистрация: 18.12.2011
Сообщений: 15,992
Завершенные тесты: 1
09.11.2013, 19:53 #2
*pS='\0'; Означает, что в этом месте строка заканчивается.
Надо не ноль вставлять, а подвинуть всю строку:
C++
1
2
3
4
5
6
7
8
9
10
     while (*pS)
        {
            if(*pS == digit && *(pS+1)== digit)
            {
                for(char* pt=pS;*(pt+1);pt++)
                  (*pt)=(*pt+1);
                pS--; // повторно проверить текущий символ
            }
            pS++;
        }
1
Lahden
1 / 1 / 0
Регистрация: 26.09.2013
Сообщений: 52
09.11.2013, 20:17  [ТС] #3
Не работает, вместо смещения элементов, просто увеличивает все, что стоит после последовательности, и ее саму на 1
0
alsav22
5428 / 4823 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
10.11.2013, 00:14 #4
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
    cout << "Enter digit, please -> " << endl;
    char digit;
    (cin >> digit).get();
    
    cout << "Enter string, please -> ";
    char *tmp = new char[80];
    cin.getline (tmp, 80);
    
    char *str = tmp;
    while (*tmp != '\0')
    {
        if (*tmp == digit && *(tmp + 1) == digit)
        {
            char *ind = tmp;
            while (*tmp == digit && *tmp) ++tmp;
            
            strcpy(ind, tmp);
            
            if (tmp == '\0') break;
            
            tmp = ind - 1;
        }
        ++tmp;
    }
    
    cout << str << endl;
    
    delete [] str;
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
    cout << "Enter digit, please -> " << endl;
    char digit;
    (cin >> digit).get();
    cout << "Enter string, please -> ";
    char str[80];
    cin.getline (str, 80);
    
    char *Tmp = new char[strlen(str) + 1];
    char *pTmp = Tmp;
    char *tmp = str;
    while (*tmp != '\0')
    {
        if (*tmp == digit && *(tmp + 1) == digit)
            while (*tmp == digit && *tmp) ++tmp;
            if ( *tmp == '\0') break; 
            
            *pTmp = *tmp;
            ++pTmp;
            ++tmp;
    }
    *pTmp = '\0';
    
    cout << Tmp << endl;
    delete [] Tmp;
    
    cout << endl;
    system("pause");
    return 0;
}
1
Lahden
1 / 1 / 0
Регистрация: 26.09.2013
Сообщений: 52
10.11.2013, 12:38  [ТС] #5
alsav22, а можешь пожалуйста показать, как сделать чтобы удалялись просто все цифры, эквивалентные введенной?
0
alsav22
5428 / 4823 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
10.11.2013, 20:41 #6
Если использовать один массив (1-й код), то просто убрать второе условие из if():
C++
1
2
if (*tmp == digit)
{...
Если - два (2-й код), то исключить запись ненужной цифры во второй массив:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
cout << "Enter digit, please -> " << endl;
    char digit;
    (cin >> digit).get();
    cout << "Enter string, please -> ";
    char str[80];
    cin.getline (str, 80);
    
    char *Tmp = new char[strlen(str) + 1];
    char *pTmp = Tmp;
    char *tmp = str;
    while (*tmp != '\0')
    {
        if (*tmp != digit)
        {
           *pTmp = *tmp;
            ++pTmp;
        }
        ++tmp; 
    }
    *pTmp = '\0';
    
    cout << Tmp << endl;
    delete [] Tmp;
1
Lahden
1 / 1 / 0
Регистрация: 26.09.2013
Сообщений: 52
10.11.2013, 22:04  [ТС] #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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#include "work_4.h"
#include <iostream>
#include <cstring>
using namespace std;
 
int main()
{
    char* pTmp;
    char tmp [80];
    int digit;
    do
    {
        cout << "Enter string, please -> ";
        cin.getline (tmp,80);
        pTmp = new char [strlen(tmp)+1];
        strcpy_s (pTmp, strlen(tmp)+1,tmp);
        cout << "Enter digit, please -> " << endl;
        cin >> digit;
        char d = '0'+digit;
        int res;
        res = amountSymbol(tmp, d);
        char* pS = pTmp;
        char* str = tmp;
        while (*str != '\0')
        {
            if (*str == d && *(str + 1) == d)
                while(*str == d && *str)
                    ++str;
            if ( *str == '\0')
                break;
            *pS = *str;
            ++pS;
            ++str;
        }
        *pS = '\0';
        cout << res << endl;
        cout << pTmp << endl;
        delete [] pTmp;
    }while(strlen(tmp)%2==0);
    return 0;
}
первый раз ппрсит ввести строку, я ввожу, потом цифру, я ввожу, все что надо он делает(считает кол-во вхождений и убирает последовательности), если длина введенной строки - нечетное число, программа завершается. Если она четное, то после окончания действий он должен снова попросить ввести строку, потом цифру и пр., но "Enter string, please -> " и "Enter digit, please -> " он выводит сразу в одной строке друг за другом, и если я ввожу, например, 1234, то он сразу пишет 0, не дожидаясь ввода цифры. Вопрос: Что я делаю не так?
0
alsav22
5428 / 4823 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
10.11.2013, 22:11 #8
Обратите внимание на эту строку в моём коде:
Цитата Сообщение от alsav22 Посмотреть сообщение
(cin >> digit).get();
Я же не просто так применяю такую конструкцию, а для чего-то.
1
Lahden
1 / 1 / 0
Регистрация: 26.09.2013
Сообщений: 52
17.11.2013, 13:36  [ТС] #9
А можно сделать удаление последовательности без использования указателя на саму строку, т.е работать только с копией строки?
Алгоритм вроде такой:
1. Находим первый символ, эквивалентный цифре
2. Если следующий тоже эквивалентен цифре, то передвигаем указатель пока не закончится последовательность
3. На место этой последовательности двигаем все элементы, которые после нее
0
alsav22
5428 / 4823 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
17.11.2013, 23:11 #10
Делаете копию строки и первый вариант кода (без второго условия в if).
0
17.11.2013, 23:11
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.11.2013, 23:11
Привет! Вот еще темы с ответами:

Проход матрицы используя указатели - C++
Никогда не любил использовать указатели, а мне сказали мол лабу надо делать еще и на указателях. Условие: узнать совпадают ли сумы...

Обработка строк,используя указатели - C++
Здравствуйте. Помогите, пожалуйста, решить задачу. Заранее спасибо. 1)Ввести строку в символьный массив tmp . 2)Выделить блок памяти...

Заполнить массив, используя указатели - C++
MAYDAY! Нужна помощь по написанию вот такой программы. Дан массив a из n действительных чисел. Используя указатели, заполнить массив B,...

Просуммировать элементы массива используя указатели - C++
III. Создайте 5 елементный статический массив переменных типа int и заполните его произвольными значениями. Затем создайте указатель,...


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

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

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