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

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

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

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

09.11.2013, 19:42. Просмотров 357. Ответов 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++
Помогите, пожалуйста, сделать программу. Ввести произвольное предложение с клавиатуры, слова отделяются пробелами. Вывести это...

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

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

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

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

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

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

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
zss
Модератор
Эксперт С++
6321 / 5905 / 1913
Регистрация: 18.12.2011
Сообщений: 15,181
Завершенные тесты: 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
5416 / 4812 / 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
5416 / 4812 / 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
5416 / 4812 / 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. На место этой последовательности двигаем все элементы, которые после нее
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.11.2013, 23:11     Обработать строку, используя указатели
Еще ссылки по теме:

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

Вывести минимальный элемент используя указатели - C++
Написать программу, которая выводит минимальный элемент введенного с клавиатуры массива целых чисел (состоящего из 6 элементов). Для...

Используя указатели, сформировать вещественный массив - C++
доброго времени суток . такая задача двумерный массив размер 3 на 4 (тоесть вектор векторов). Используя указатели , сформировать...

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

Создание 2D массива из объектов, используя указатели - C++
Помогите решить простую задачу. Нужно создать 2х мерный массив из объектов. Каждый объект это точка с координатой x and y. Массив должен...


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

Или воспользуйтесь поиском по форуму:
alsav22
5416 / 4812 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
17.11.2013, 23:11     Обработать строку, используя указатели #10
Делаете копию строки и первый вариант кода (без второго условия в if).
Yandex
Объявления
17.11.2013, 23:11     Обработать строку, используя указатели
Ответ Создать тему
Опции темы

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