char cStr[] = "string";
char *p;
p = cStr +1;
cout << cStr << endl; // string
cout << p; // tring
Есть ли функция для удаления N первых элементов строки?
:) Если - да, то какая?
str.erase(0, N);
...char.
если нету, то как некий char скопировать в регистр, ну и c регистра в некий иной char обратно - минимум времени на последовательную перестановку всех елементов строки (some[i-1]=some - потом последнему=NULL)
Цитата: Alkaw
если нету, то как некий char скопировать в регистр, ну и c регистра в некий иной char обратно - минимум времени на последовательную перестановку всех елементов строки (some[i-1]=some - потом последнему=NULL)
переведи в string и работай... когда надо обратно в char* загонишь
Да я вот чё решил все элементы - swap (#include <algorithm>). Последнему - NULL: за одно удаление нужно удалить только первый, поэтому мне кажется это наиболее эффективно. Swap-ает наверно через регистр (как буфер), или нет(?) как узнать?
extern void swap(int*, int*); // описание
void swap(int*, int*) // определение
(*
int t = *p;
*p =*q;
*q = t;
*)
Все ок, тема закрыта.
Цитата: Alkaw
:) Если - да, то какая?
А если просто добавить к указателю на начало строки 6
Цитата: Rebbit
А если просто добавить к указателю на начало строки 6
и я о том же подумал :) думаю самое рациональное решение
Цитата: Rebbit
А если просто добавить к указателю на начало строки 6
Где-то тут чувствуется подвох... Тут насколько я понял можно создать новый указатель и его сместить. Т.е. получится как-бы вторая строка. Например:
Код:
Но
Код:
char cStr[] = "string";
cStr++; // Ошибка
cout << cStr;
cStr++; // Ошибка
cout << cStr;
Код:
#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;
}
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;
}
вот еще Сишная функция
Цитата:
[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).
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).
delete ptr;
а
delete [] ptr;
и как-то я боюсь этой строки... получается освобождаем не совсем ту память, которую выделяли для массива.
Цитата: Kogrom
Не
delete ptr;
а
delete [] ptr;
и как-то я боюсь этой строки... получается освобождаем не совсем ту память, которую выделяли для массива.
delete ptr;
а
delete [] ptr;
и как-то я боюсь этой строки... получается освобождаем не совсем ту память, которую выделяли для массива.
это я уже в цитате дописывал :) забыл поставить, на Сях не имею практики сейчас поэтому такие ляпы
Код:
char g[] = "hello";
memcpy(g, g+2,sizeof(g) - 2);
//нолик также копируется :)
Label1->Caption = (AnsiString)g;
memcpy(g, g+2,sizeof(g) - 2);
//нолик также копируется :)
Label1->Caption = (AnsiString)g;
Зделать ф-ю, где 2-ка это один из параметров сколько букв глотается
Цитата: iridum
Код:
char g[] = "hello";
memcpy(g, g+2,sizeof(g) - 2);
//нолик также копируется :)
Label1->Caption = (AnsiString)g;
memcpy(g, g+2,sizeof(g) - 2);
//нолик также копируется :)
Label1->Caption = (AnsiString)g;
Зделать ф-ю, где 2-ка это один из параметров сколько букв глотается
Иду и читаю стандарт, а там написано, что при использовании memcpy массивы не должны перекрываться - это приведет к неопределенному состоянию. Читаю дальше и обнаруживаю функцию memmove, у которой нет подобного ограничения.
Т.е. в вашей программе надо заменить memcpy на memmove и всем будет счастье.