Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Есть ли функция для удаления N первых элементов строки?

34K
20 марта 2008 года
Alkaw
14 / / 15.03.2008
:) Если - да, то какая?
87
20 марта 2008 года
Kogrom
2.7K / / 02.02.2008
Если строка типа string то erase. Например:
str.erase(0, N);
34K
20 марта 2008 года
Alkaw
14 / / 15.03.2008
...char.
34K
20 марта 2008 года
Alkaw
14 / / 15.03.2008
если нету, то как некий char скопировать в регистр, ну и c регистра в некий иной char обратно - минимум времени на последовательную перестановку всех елементов строки (some[i-1]=some - потом последнему=NULL)
11
20 марта 2008 года
oxotnik333
2.9K / / 03.08.2007
Цитата: Alkaw
если нету, то как некий char скопировать в регистр, ну и c регистра в некий иной char обратно - минимум времени на последовательную перестановку всех елементов строки (some[i-1]=some - потом последнему=NULL)



переведи в string и работай... когда надо обратно в char* загонишь

34K
20 марта 2008 года
Alkaw
14 / / 15.03.2008
Да я вот чё решил все элементы - swap (#include <algorithm>). Последнему - NULL: за одно удаление нужно удалить только первый, поэтому мне кажется это наиболее эффективно. Swap-ает наверно через регистр (как буфер), или нет(?) как узнать?
34K
20 марта 2008 года
Alkaw
14 / / 15.03.2008
Чрез указатели:
extern void swap(int*, int*); // описание
void swap(int*, int*) // определение
(*
int t = *p;
*p =*q;
*q = t;
*)

Все ок, тема закрыта.
276
21 марта 2008 года
Rebbit
1.1K / / 01.08.2005
Цитата: Alkaw
:) Если - да, то какая?


А если просто добавить к указателю на начало строки 6

14K
21 марта 2008 года
stimpi
100 / / 04.09.2007
Цитата: Rebbit
А если просто добавить к указателю на начало строки 6



и я о том же подумал :) думаю самое рациональное решение

87
21 марта 2008 года
Kogrom
2.7K / / 02.02.2008
Цитата: Rebbit
А если просто добавить к указателю на начало строки 6



Где-то тут чувствуется подвох... Тут насколько я понял можно создать новый указатель и его сместить. Т.е. получится как-бы вторая строка. Например:

 
Код:
char cStr[] = "string";
    char *p;
    p = cStr +1;
    cout << cStr << endl; // string
    cout << p; // tring

Но
 
Код:
char cStr[] = "string";
    cStr++; // Ошибка
    cout << cStr;
14K
21 марта 2008 года
stimpi
100 / / 04.09.2007
имелось виду вот это

Код:
#include <iostream>

using namespace std;

void main()
{
    char *ptr = new char[16];
    strcpy(ptr,"hello world");

    cout << ptr << endl;

    ptr = ptr + 6;

    cout << ptr << endl;    
delete ptr;
}
Но в таком коде насколько я понял memory leak :) 6 байтов ушло в никуда до остановки процесса :p


вот еще Сишная функция

Цитата:
[COLOR=#008000]void * memcpy ( void * destination, const void * source, size_t num );[/COLOR] [COLOR=#000080]<cstring>[/COLOR] Copy block of memory
Copies the values of num bytes from the location pointed by source directly to the memory block pointed by destination.
The underlying type of the objects pointed by both the source and destination pointers are irrelevant for this function; The result is a binary copy of the data.
The function does not check for any terminating null character in source - it always copies exactly num bytes.
To avoid overflows, the size of the arrays pointed by both the destination and source parameters, shall be at least num bytes, and should not overlap (for overlapping memory blocks, memmove is a safer approach).

87
21 марта 2008 года
Kogrom
2.7K / / 02.02.2008
Не
delete ptr;
а
delete [] ptr;

и как-то я боюсь этой строки... получается освобождаем не совсем ту память, которую выделяли для массива.
14K
21 марта 2008 года
stimpi
100 / / 04.09.2007
Цитата: Kogrom
Не
delete ptr;
а
delete [] ptr;

и как-то я боюсь этой строки... получается освобождаем не совсем ту память, которую выделяли для массива.



это я уже в цитате дописывал :) забыл поставить, на Сях не имею практики сейчас поэтому такие ляпы

9.3K
22 марта 2008 года
iridum
175 / / 26.08.2007
 
Код:
char g[] = "hello";
 memcpy(g, g+2,sizeof(g) - 2);

 //нолик также копируется :)

 Label1->Caption = (AnsiString)g;


Зделать ф-ю, где 2-ка это один из параметров сколько букв глотается
87
22 марта 2008 года
Kogrom
2.7K / / 02.02.2008
Цитата: iridum
 
Код:
char g[] = "hello";
 memcpy(g, g+2,sizeof(g) - 2);

 //нолик также копируется :)

 Label1->Caption = (AnsiString)g;


Зделать ф-ю, где 2-ка это один из параметров сколько букв глотается



Иду и читаю стандарт, а там написано, что при использовании memcpy массивы не должны перекрываться - это приведет к неопределенному состоянию. Читаю дальше и обнаруживаю функцию memmove, у которой нет подобного ограничения.

Т.е. в вашей программе надо заменить memcpy на memmove и всем будет счастье.

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог