Здравствуйте. Чего то я совсем запарился с указателями Помогите а? Код (Text): char z(char* Stroka) { char Buf[255]=""; memcpy(Buf, &Stroka[2], 2); //LeftStr return *Buf; }; void CMy78Dlg::OnOK() { // TODO: Add extra validation here MessageBox((const char*)z("123456"),"",0);// здесь ошибку выдает } тег code используем, да?
Так совсем нельзя делать -- ты выделяешь место под Buf[255] в стековом кадре, который гибнет сразу после выхода из ф-ии (м.б. данные и не запортятся -- тут как повезет). memcpy, если я не ошибаюсь, принимает 2 параметра, а не 3 (имелось ввиду memncpy?..) MessageBox тоже хочет 4 параметра, на 3. Ну это так, в общем... Что вообще сделать требуется?
Нужно сделать функию MIdStr типа как в Паскале MidStr(Source: String; Start, Size: Integer): string; т.е source строка допустим "123456" Start начало отсчета доп 2 Size размер доп 3 на выходе получаем 345 на паскакале я это махом реализовал а вот на сишнике с указателями запарился (
Mika0x65 прав, char Buf[255] надо сделать глобальной. void *memcpy( void *dest, const void *src, size_t count ); В MFC есть вот такая надстройка: int MessageBox( LPCTSTR lpszText, LPCTSTR lpszCaption = NULL, UINT nType = MB_OK );
Не обязательно глобальной -- можно держать ее в стеке вызывающей ф-ии. Бес попутал . Delphi В твоем случае прототип должен выглядеть так: char *MidStr(char *dst, char *src, int start, int len); В dst передаешь указатель на буфер, куда требуется скопировать, в src -- откуда. Возвращать char * -- указатель на результат -- не обязательно, можно, например, возвращать там число реально скопированных литер (на случай, если src окажется короче). В общем, зависит от того, что ты хочешь сделать. Вызов тогда должен выглядеть примерно так: Код (Text): char src[] = "Hello, C++!"; char dst[5]; MidStr(dst, src, 0, 4); dst[4] = '\0'; //Не забудь вставить NULL terminator в конце :). printf("%s\n", dst);
Bohdan200 Mika0x65 прав, char Buf[255] надо сделать глобальной. Все даже еще хуже. Статическое выделение памяти под строки - зло и мерзость. Делать надо примерно так: Код (Text): char* MidStr(char* str,int start,int len) { char* r2=res=(char*)malloc(len+1); for(char* p=str+start;*p && len;p++,r2++,len--) *r2=*p; *r2='\0'; return res; } Потом, правда, надо память не забыть освободить.
Delphi Можно сделать и не глобальной этот Buf! Почему? Потому что есть naked , то бишь самому можно определить и пролог и эпилог, а следовательно убийство локальных переменных ф-ции! Но надо ли это? Бросается что ты принимаешь указатель на символы! А копируешь: , т.е не сами байты-символы,а байты из которых состоит значение указателя на символы! К тому же возвраешь не указатель на строку, а черте что:
Если не жалко входной строки и она читабельно-писабельна ))) Код (Text): char *midstr(char *src, int start, int len) { src[start+len+1]=0; return &str[start] } только start zero based
А почему? Все-таки поиск и выделение блока памяти -- время. +фрагментация и возможность утечки. Мелкие объекты, ИМХО, можно и в стеке держать.
Mika0x65 Delphi, VB и т.д. - все так делают. Плохо, конечно, но как иначе поступить? В стеке их держать извратными способами... Так вся логика работы со стеком на порядок усложнится.
Почему извратными? Не, ну конечно, стек растет вниз, массив растет вверх -- поначалу путаешься, но со временем проходит . Единственная проблема, которую я знаю -- если массив больше страницы, приходится "прощелкивать" вниз каждую страницу массива, чтобы сдвинуть вниз защитную страницу и не скакнуть за нее.
Если нужна большая скорость - работаем со статической памятью Если важна прозрачность и структурированность проги - new/delete/malloc/free Как на меня - возвращать хитрым способом строку в стеке - полный изврат. Все функции работы со строками __declspec(naked) - это УЖОС!!!
Учите матчасть. А вообще, для c++ есть rsdn.ru и книги. Bohdan200 return str + start Delphi Посмотри std::string или CString, может пройдёт желание писать делфийские обёртки над С++