Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как с массива чаров найти и удалить, фрагмент строки 
:(
    Опции темы
Sergio
  Дата 8.10.2008, 17:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 843
Регистрация: 28.7.2006
Где: Solar System-> Earth

Репутация: нет
Всего: 1



Как с массива чаров найти и удалить фрагмент строки.
 Может может есть стандартный алгоритм STL?
Нужно что-то типа этого:
Код

char* result = FindAndDestroy(char* destination, char* fragment);


Это сообщение отредактировал(а) Sergio - 8.10.2008, 17:29
PM MAIL ICQ   Вверх
Lin07
Дата 8.10.2008, 19:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 49
Регистрация: 19.7.2008

Репутация: -1
Всего: -1



может replace(find,"") ?

Код

#include <iostream>
#include <vector>
#include <algorithm>
#include <functional>

using namespace std;


int main()
{
    const int VECTOR_SIZE = 8 ;

    // Define a template class vector of integers
    typedef vector<int > IntVector ;

    //Define an iterator for template class vector of integer
    typedef IntVector::iterator IntVectorIt ;

    IntVector Numbers(VECTOR_SIZE) ;   //vector containing numbers

    IntVectorIt start, end, it ;

    start = Numbers.begin() ;   // location of first
                                // element of Numbers

    end = Numbers.end() ;       // one past the location
                                // last element of Numbers

    //Initialize vector Numbers
    Numbers[0] = 10 ;
    Numbers[1] = 20 ;
    Numbers[2] = 10 ;
    Numbers[3] = 15 ;
    Numbers[4] = 12 ;
    Numbers[5] = 7 ;
    Numbers[6] = 9 ;
    Numbers[7] = 10 ;

    cout << "Before calling replace" << endl ;

    // print content of Numbers
    cout << "Numbers { " ;
    for(it = start; it != end; it++)
        cout << *it << " " ;
    cout << " }\n" << endl ;

    // remove all elements from Numbers that match 10
     replace(start, end, 10, 35) ;

    cout << "After calling replace, to replace all 10's with 35" << endl ;

    // print content of Numbers
    cout << "Numbers { " ;
    for(it = start; it != end; it++)
        cout << *it << " " ;
    cout << " }\n" << endl ;

}


ps для векторов она работает, но вот с чарами не знаю будет ли она  работать... вот со тончно нгами да... 


Это сообщение отредактировал(а) Lin07 - 8.10.2008, 19:36
PM MAIL   Вверх
Sergio
Дата 8.10.2008, 20:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 843
Регистрация: 28.7.2006
Где: Solar System-> Earth

Репутация: нет
Всего: 1



Сделал попроще (я думаю)
Код

// return number of index from which fragment begins
// if return -1 than not found
int find_fragment(char* dest, char* fragment)
{
    int res = -1;

    for (int a = 0; a < strlen(dest); a++)
    {
        if (dest[a] == fragment[0])
        {
            for (int b = 0; b < strlen(fragment); b++)
            {
                if (dest[a + b] == fragment[b])
                {
                    res = a;
                    continue;        // it's ok go ahead
                }    
                else
                {
                    res = -1;
                    break;            // find next
                }
            }
        }
        if (res != -1)                // only one matching should be
            return res;
    }
    return res;
}

Код

int _tmain(int argc, _TCHAR* argv[])
{
    char* dest = "F:\\GTP\\Jimi Hendrix\\Hendrix Jimi - Drifting.gp3";
    char* fragment = "F:\\GTP\\Jimi Hendrix\\";

    int res = find_fragment(dest, fragment);

    char resStr[100];
    int d = 0;
    if (res != -1)
    {
        for (int c = 0; c<strlen(dest); c++)
        {
            if (c < res || c >= strlen(fragment))
            {
                resStr[d] = dest[c];
                d++;
            }    
        }    
        resStr[strlen(dest) - strlen(fragment)] = '\0';
    }
    return 0;
}

Пожалуйста порефакторьте код. Потому как он очень большой( 
P.S. извините за на звание переменных smile 
PM MAIL ICQ   Вверх
Rickert
Дата 9.10.2008, 05:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ситхи не пройдут!
****


Профиль
Группа: Комодератор
Сообщений: 3356
Регистрация: 11.7.2006
Где: Лакрима

Репутация: нет
Всего: 52



Руками всегда самый верный способ


--------------------
Ни что не внушает сна крепче, чем день приисполненный трудов!
PM MAIL WWW Skype GTalk   Вверх
xvr
Дата 9.10.2008, 10:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 35
Всего: 223



Цитата(Sergio @ 8.10.2008,  20:30)
Сделал попроще (я думаю)
Код

// return number of index from which fragment begins
// if return -1 than not found
int find_fragment(char* dest, char* fragment)
{
    int res = -1;

    for (int a = 0; a < strlen(dest); a++)
    {
        if (dest[a] == fragment[0])
        {
            for (int b = 0; b < strlen(fragment); b++)
            {
                if (dest[a + b] == fragment[b])
                {
                    res = a;
                    continue;        // it's ok go ahead
                }    
                else
                {
                    res = -1;
                    break;            // find next
                }
            }
        }
        if (res != -1)                // only one matching should be
            return res;
    }
    return res;
}

Код

int _tmain(int argc, _TCHAR* argv[])
{
    char* dest = "F:\\GTP\\Jimi Hendrix\\Hendrix Jimi - Drifting.gp3";
    char* fragment = "F:\\GTP\\Jimi Hendrix\\";

    int res = find_fragment(dest, fragment);

    char resStr[100];
    int d = 0;
    if (res != -1)
    {
        for (int c = 0; c<strlen(dest); c++)
        {
            if (c < res || c >= strlen(fragment))
            {
                resStr[d] = dest[c];
                d++;
            }    
        }    
        resStr[strlen(dest) - strlen(fragment)] = '\0';
    }
    return 0;
}

Пожалуйста порефакторьте код. Потому как он очень большой( 
P.S. извините за на звание переменных smile

Да уж, проще некуда  smile 
Код

int _tmain(int argc, _TCHAR* argv[])
{
    char* dest = "F:\\GTP\\Jimi Hendrix\\Hendrix Jimi - Drifting.gp3";
    char* fragment = "F:\\GTP\\Jimi Hendrix\\";

    char* fr=strstr(dest, fragment);
    if (fr)
     {
       char* fr2=fr+strlen(fragment);
       memmove(fr,fr2,strlen(fr2)+1);
     }

    return 0;
}

PM MAIL   Вверх
mrbrooks
Дата 9.10.2008, 10:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


Профиль
Группа: Завсегдатай
Сообщений: 4259
Регистрация: 4.10.2006
Где: Дол Гулдур

Репутация: 19
Всего: 306



Цитата(Rickert @  9.10.2008,  05:57 Найти цитируемый пост)
Руками всегда самый верный способ 
 Не согласен  smile 

Цитата(xvr @  9.10.2008,  10:02 Найти цитируемый пост)
Да уж, проще некуда  smile 
 Согласен  smile 

Sergio, я вообще на столько обленилсо, что юзаю только std::string - и мне от этого так хорошо, в отличие от массивов char. Тем более их можно друг с дружкой подружить.


PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0758 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.