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

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

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

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

09.11.2013, 19:42. Просмотров 349. Ответов 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++ Ввести с клавиатуры строку символов и обработать ее
C++ Создание 2D массива из объектов, используя указатели
Обработка строк,используя указатели C++
Написать программу копирования строки T в строку S, используя указатели. C++
C++ Используя динамические массивы, обработать элементы одномерного массива
C++ Используя динамический массив, обработать элементы
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
zss
Модератор
Эксперт С++
6248 / 5851 / 1891
Регистрация: 18.12.2011
Сообщений: 14,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++;
        }
Lahden
1 / 1 / 0
Регистрация: 26.09.2013
Сообщений: 52
09.11.2013, 20:17  [ТС]     Обработать строку, используя указатели #3
Не работает, вместо смещения элементов, просто увеличивает все, что стоит после последовательности, и ее саму на 1
alsav22
5415 / 4811 / 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
5415 / 4811 / 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
5415 / 4811 / 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++
Вывести минимальный элемент используя указатели C++
C++ Просуммировать элементы массива используя указатели
C++ Заполнить массив, используя указатели

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

Или воспользуйтесь поиском по форуму:
alsav22
5415 / 4811 / 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