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

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

Восстановить пароль Регистрация
 
Lahden
1 / 1 / 0
Регистрация: 26.09.2013
Сообщений: 52
09.11.2013, 19:42     Обработать строку, используя указатели #1
Условие обработки:
Удалить последоватьльность из двух и более символов, эквивалентных заданной цифре.

Если после последовательность стоят еще другие цыфры или буквы, то их тоже почему то удаляет, помогите исправить
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;
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
zss
Модератор
Эксперт С++
 Аватар для zss
5955 / 5560 / 1788
Регистрация: 18.12.2011
Сообщений: 14,209
Завершенные тесты: 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
5282 / 4801 / 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
5282 / 4801 / 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
5282 / 4801 / 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++ Как используя командную строку ввести символьную строку?

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

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

Текущее время: 12:17. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru