![]() |
Модераторы: bsa |
![]() ![]() ![]() |
|
babat |
|
|||
Новичок Профиль Группа: Участник Сообщений: 29 Регистрация: 6.11.2011 Репутация: нет Всего: нет |
Помогите написать функции для работы со строками)
Я несколько написал,но не работают как надо. 1)int strlen(char*s) 2)char*strcpy(char*dest,char*s,int p,int k) 3)char*strdel(char*s,int p,int k) 4)char*strins(char*sub,char*s,int p) 5)int strpos(char*sub,char*s) 6)int strcmp(char*s1,char*s2) 7)char*strcat(char*dest,char*s1,char*s2) 1) strlen -длина строки 2) strcpy-помещает в dest K символов строки S,начиная с Р-го 3) strdel- Удаляет из S K символов,начиная с Р-го 4) strins - вставляет sub в s с р-й позиции,с предположением,что в S достаточно места 5) strpos - возвращает позицию 1-го вхождения sub в s или -1 6) strcmp- возвращает 0 если строки равны,1 если s1>s2,-1 если s1<s2 7) strcat- Сцепляет s1 и s2 и помещает их в dest Задание:реализовать 6 из 7 функции в 4х вариантах каждую. Вот написал
Это без проверок всяких.Почему мусор какой-то выводит? Это сообщение отредактировал(а) babat - 6.11.2011, 18:23 |
|||
|
||||
tzirechnoy |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1173 Регистрация: 30.1.2009 Репутация: -1 Всего: 16 |
Как минимум строка не завершэна '\0'. Но, не зная задание, не могу сказать -- это ошыбка реализацыи strcpy1 или Вы неправильно пытаетесь его использовать.
|
|||
|
||||
babat |
|
|||
Новичок Профиль Группа: Участник Сообщений: 29 Регистрация: 6.11.2011 Репутация: нет Всего: нет |
1) strlen -длина строки
2) strcpy-помещает в dest K символов строки S,начиная с Р-го 3) strdel- Удаляет из S K символов,начиная с Р-го 4) strins - вставляет sub в s с р-й позиции,с предположением,что в S достаточно места 5) strpos - возвращает позицию 1-го вхождения sub в s или -1 6) strcmp- возвращает 0 если строки равны,1 если s1>s2,-1 если s1<s2 7) strcat- Сцепляет s1 и s2 и помещает их в dest |
|||
|
||||
borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 21 Всего: 135 |
-------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
babat |
|
|||
Новичок Профиль Группа: Участник Сообщений: 29 Регистрация: 6.11.2011 Репутация: нет Всего: нет |
спасибо,понятно)) видимо я еще не до уонца от паскаля отцепился(
еще вопрос. Почему размер массива нельзя задавать таким способом : int k=10; char s[k]; или char s[]="12334"; char s1[strlen(s)+1]; |
|||
|
||||
volatile |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 16 Всего: 85 |
||||
|
||||
borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 21 Всего: 135 |
хммм. как это ? там же "галочка" на Си++, а не на Си стоит ![]() -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
volatile |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 16 Всего: 85 |
borisbn, Ну во первых, я здесь не увидел нигде упоминания, что нужен именно С. Ну, а раз так, то лёгким движение руки.... программка превращается....превращается... http://liveworkspace.org/code/4358235b7ac9...246f38227a92e31 ![]() |
|||
|
||||
babat |
|
||||||
Новичок Профиль Группа: Участник Сообщений: 29 Регистрация: 6.11.2011 Репутация: нет Всего: нет |
Почему в строке вывода ,где должно изначальное значение s выводиться,выводится strins?
Здесь такой-же вопрос ++ помогите исправить:
Это сообщение отредактировал(а) babat - 6.11.2011, 20:27 |
||||||
|
|||||||
borisbn |
|
||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 21 Всего: 135 |
volatile, я, почему-то, был уверен, что эти "фокусы" возможны только в Си, а в Си++ такое невозможно... babat, в ф-ции strins1 почему копирование в выходную строку начинается с i=p ??? должно быть так: 1) скопировать в выходную строку из входной с 0 до p-1 2) добавить к выходной строке подстроку (sub) 3) добавить к выходной строке входную от p до конца входной в ф-ции strdel1 будь проще и к тебе потянутся ![]()
в ф-ции strpos1 вообще всё неправильно. нужно как-то так
-------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
||||||
|
|||||||
volatile |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 16 Всего: 85 |
||||
|
||||
babat |
|
|||
Новичок Профиль Группа: Участник Сообщений: 29 Регистрация: 6.11.2011 Репутация: нет Всего: нет |
Здесь же S и есть выходная строка,а вот этим for (int i=p,j=0;i<len1;++i,++j) я копирую в s1 строку s начиная с Р-й позиции.А потом с Р-й позиции в S я заталкиваю Sub. Затем С позиции P+strlen(sub) я заталкиваю S1. Вроде как правильно,но в строке вывода printf("strins1(\"%s\",\"%s\",\"%i\")=\"%s\"\n",sub,s,p,strins1(sub,s,p)); Должно выводиться вот так : strins1("456","123789","3")="123456789" А выводит вот так: strins1("456","123456789","3")="123456789" Почему?(( Народ,HELP! Это сообщение отредактировал(а) babat - 8.11.2011, 14:52 |
|||
|
||||
borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 21 Всего: 135 |
babat, ты изменяешь первоначальную строку, а т.к. параметры в ф-цию printf передаются с конца, то сначала выполнится strins1(sub,s,p) - при этом s изменится - затем её результат передастся в printf, затем туда передастся p, а затем s (как ты помнишь - изменённое)
-------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 85 Всего: 196 |
Это implementation defined, нет? ![]() А вообще данная ситуация называется "undefined behaviour" - неопределенное поведение. |
|||
|
||||
borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 21 Всего: 135 |
почти уверен, что да. и судя по implementation'у babat у него defined именно так ![]() и опять соглашусь: такой код - прямой путь к UB. -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
babat |
|
|||
Новичок Профиль Группа: Участник Сообщений: 29 Регистрация: 6.11.2011 Репутация: нет Всего: нет |
а по русски?)
|
|||
|
||||
borisbn |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 21 Всего: 135 |
babat, вот есть у тебя ф-ция int increment_value( int * x ) и функция void foo( int a, int b ); и вызываешь ты её так
а incriment_value реализована так
теперь подумай, что получит foo в качестве a и что в качестве b.. Это сообщение отредактировал(а) borisbn - 8.11.2011, 18:23 -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
||||
|
|||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
С++11 перенял нечто из C99, чтоб сузить пропасть, возникщую за время их самостоятельног развития.. ![]() |
|||
|
||||
Lols |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 144 Регистрация: 21.10.2011 Репутация: нет Всего: нет |
Да, мне тоже казалось, что в С++ так не получится 0_о
"undefined behaviour" - неопределенное поведение - то есть, такая функция запросто может не работать? |
|||
|
||||
bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 85 Всего: 196 |
И да и нет. такая функция может работать в 99 случаев из 100... Все зависит от компилятора и параметров оптимизации. Может получиться даже так, что в режиме отладки работает, а в релизе нет, так как компилятор оптимизировал вызовы таким образом, каким не предполагал программист. А все потому, что этот код неверен... |
|||
|
||||
babat |
|
|||
Новичок Профиль Группа: Участник Сообщений: 29 Регистрация: 6.11.2011 Репутация: нет Всего: нет |
что не так?( |
|||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
||||
|
||||
bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 85 Всего: 196 |
babat, для примера, как надо писать:
|
|||
|
||||
babat |
|
|||
Новичок Профиль Группа: Участник Сообщений: 29 Регистрация: 6.11.2011 Репутация: нет Всего: нет |
Народ,помогите еще 2 написать плиз(( |
|||
|
||||
bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 85 Всего: 196 |
babat, помогают написать в другом разделе. Здесь же помогают найти ошибки, отвечают на вопросы и направляют на путь истинный.
У тебя нет вопроса. Поэтому даже не знаю, что ответить. |
|||
|
||||
babat |
|
|||
Новичок Профиль Группа: Участник Сообщений: 29 Регистрация: 6.11.2011 Репутация: нет Всего: нет |
ну хотябы словами опишите алгоритм))
|
|||
|
||||
bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 85 Всего: 196 |
чем функции strdel1 и strdel2 отличаются?
Делать нужно так: 1. в цикле от 0 до p (невключительно) ищешь признак конца строки. Если находишь, то выход. 2. в цикле от p до p+k (включительно) ищешь признак конца строки. Если находишь, то ставишь признак конца строки в позицию p и выход. 3. в цикле копируешь данные из p+k+i в p+i до тех пор, пока не встретится признак конца строки (его тоже надо скопировать). 4. выход |
|||
|
||||
babat |
|
|||
Новичок Профиль Группа: Участник Сообщений: 29 Регистрация: 6.11.2011 Репутация: нет Всего: нет |
норм? |
|||
|
||||
bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 85 Всего: 196 |
babat, на данном уровне знания языка попрошу забыть о существовании оператора goto. Используй циклы (for(;;), while(){} или do{}while()) и continue/break.
А потом, ты сильно отклонился от моего алгоритма. У меня циклы использовались обычные, без хитрых повторов. |
|||
|
||||
babat |
|
|||
Новичок Профиль Группа: Участник Сообщений: 29 Регистрация: 6.11.2011 Репутация: нет Всего: нет |
ок,предположим что del сделали) хоть и не так,как ты сказал.Но вроде все работает,система тестов все проверяет-все норм.
Перейдем к разбору других функций) зы спасибо огромное что помогаете)) strlen
норм? Это сообщение отредактировал(а) babat - 22.11.2011, 20:03 |
|||
|
||||
bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 85 Всего: 196 |
babat, видимо оператор goto ты так и не забыл.
strlen3 наиболее близок к оптимальному решению (без оптимизаций по длине машинного слова):
|
|||
|
||||
![]() ![]() ![]() |
Правила форума "C/C++: Для новичков" | |
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |