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

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

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

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

09.11.2013, 19:42. Просмотров 358. Ответов 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;
}
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++
Здравствуйте! помогите пожалуйста со строками в С++! Ввести с клавиатуры строку символов и обработать ее в соответствии со своим...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
zss
Модератор
Эксперт С++
6358 / 5922 / 1919
Регистрация: 18.12.2011
Сообщений: 15,218
Завершенные тесты: 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++;
        }
Lahden
1 / 1 / 0
Регистрация: 26.09.2013
Сообщений: 52
09.11.2013, 20:17  [ТС] #3
Не работает, вместо смещения элементов, просто увеличивает все, что стоит после последовательности, и ее саму на 1
alsav22
5417 / 4813 / 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;
}
Lahden
1 / 1 / 0
Регистрация: 26.09.2013
Сообщений: 52
10.11.2013, 12:38  [ТС] #5
alsav22, а можешь пожалуйста показать, как сделать чтобы удалялись просто все цифры, эквивалентные введенной?
alsav22
5417 / 4813 / 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;
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, не дожидаясь ввода цифры. Вопрос: Что я делаю не так?
alsav22
5417 / 4813 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
10.11.2013, 22:11 #8
Обратите внимание на эту строку в моём коде:
Цитата Сообщение от alsav22 Посмотреть сообщение
(cin >> digit).get();
Я же не просто так применяю такую конструкцию, а для чего-то.
Lahden
1 / 1 / 0
Регистрация: 26.09.2013
Сообщений: 52
17.11.2013, 13:36  [ТС] #9
А можно сделать удаление последовательности без использования указателя на саму строку, т.е работать только с копией строки?
Алгоритм вроде такой:
1. Находим первый символ, эквивалентный цифре
2. Если следующий тоже эквивалентен цифре, то передвигаем указатель пока не закончится последовательность
3. На место этой последовательности двигаем все элементы, которые после нее
alsav22
5417 / 4813 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
17.11.2013, 23:11 #10
Делаете копию строки и первый вариант кода (без второго условия в if).
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 и заполните его произвольными значениями. Затем создайте указатель,...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
17.11.2013, 23:11
Ответ Создать тему
Опции темы

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