Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > C/C++: Для новичков > Помощь в написании функций |
Автор: babat 6.11.2011, 11:06 | ||
Помогите написать функции для работы со строками) Я несколько написал,но не работают как надо. 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х вариантах каждую. Вот написал
Это без проверок всяких.Почему мусор какой-то выводит? |
Автор: tzirechnoy 6.11.2011, 11:17 |
Как минимум строка не завершэна '\0'. Но, не зная задание, не могу сказать -- это ошыбка реализацыи strcpy1 или Вы неправильно пытаетесь его использовать. |
Автор: babat 6.11.2011, 11:32 |
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 6.11.2011, 11:40 | ||
|
Автор: babat 6.11.2011, 11:49 |
спасибо,понятно)) видимо я еще не до уонца от паскаля отцепился( еще вопрос. Почему размер массива нельзя задавать таким способом : int k=10; char s[k]; или char s[]="12334"; char s1[strlen(s)+1]; |
Автор: volatile 6.11.2011, 12:49 |
Кое-где можно http://liveworkspace.org/code/5adb082f5001766f1274d2a304352625 |
Автор: borisbn 6.11.2011, 16:09 |
хммм. как это ? там же "галочка" на Си++, а не на Си стоит ![]() |
Автор: volatile 6.11.2011, 16:30 |
borisbn, Ну во первых, я здесь не увидел нигде упоминания, что нужен именно С. Ну, а раз так, то лёгким движение руки.... программка превращается....превращается... http://liveworkspace.org/code/4358235b7ac9f7f93246f38227a92e31 ![]() |
Автор: babat 6.11.2011, 18:54 | ||||||
Почему в строке вывода ,где должно изначальное значение s выводиться,выводится strins?
Здесь такой-же вопрос ++ помогите исправить:
|
Автор: volatile 7.11.2011, 00:39 |
на сайте у бусткодера возможно всё! ![]() |
Автор: babat 7.11.2011, 08:56 | ||
Здесь же 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! |
Автор: borisbn 8.11.2011, 16:57 |
babat, ты изменяешь первоначальную строку, а т.к. параметры в ф-цию printf передаются с конца, то сначала выполнится strins1(sub,s,p) - при этом s изменится - затем её результат передастся в printf, затем туда передастся p, а затем s (как ты помнишь - изменённое) |
Автор: bsa 8.11.2011, 17:28 |
Это implementation defined, нет? ![]() А вообще данная ситуация называется "undefined behaviour" - неопределенное поведение. |
Автор: borisbn 8.11.2011, 18:04 |
почти уверен, что да. и судя по implementation'у babat у него defined именно так ![]() и опять соглашусь: такой код - прямой путь к UB. |
Автор: babat 8.11.2011, 18:15 |
а по русски?) |
Автор: borisbn 8.11.2011, 18:21 | ||||
babat, вот есть у тебя ф-ция int increment_value( int * x ) и функция void foo( int a, int b ); и вызываешь ты её так
а incriment_value реализована так
теперь подумай, что получит foo в качестве a и что в качестве b.. |
Автор: mes 8.11.2011, 19:51 |
С++11 перенял нечто из C99, чтоб сузить пропасть, возникщую за время их самостоятельног развития.. ![]() |
Автор: Lols 8.11.2011, 20:59 |
Да, мне тоже казалось, что в С++ так не получится 0_о "undefined behaviour" - неопределенное поведение - то есть, такая функция запросто может не работать? |
Автор: bsa 8.11.2011, 21:39 | ||
И да и нет. такая функция может работать в 99 случаев из 100... Все зависит от компилятора и параметров оптимизации. Может получиться даже так, что в режиме отладки работает, а в релизе нет, так как компилятор оптимизировал вызовы таким образом, каким не предполагал программист. А все потому, что этот код неверен... |
Автор: babat 13.11.2011, 17:27 | ||
что не так?( |
Автор: mes 13.11.2011, 18:41 | ||
|
Автор: bsa 13.11.2011, 20:38 | ||
babat, для примера, как надо писать:
|
Автор: babat 16.11.2011, 16:24 | ||
Народ,помогите еще 2 написать плиз(( |
Автор: bsa 16.11.2011, 17:31 |
babat, помогают написать в другом разделе. Здесь же помогают найти ошибки, отвечают на вопросы и направляют на путь истинный. У тебя нет вопроса. Поэтому даже не знаю, что ответить. |
Автор: babat 16.11.2011, 20:05 |
ну хотябы словами опишите алгоритм)) |
Автор: bsa 16.11.2011, 20:19 |
чем функции strdel1 и strdel2 отличаются? Делать нужно так: 1. в цикле от 0 до p (невключительно) ищешь признак конца строки. Если находишь, то выход. 2. в цикле от p до p+k (включительно) ищешь признак конца строки. Если находишь, то ставишь признак конца строки в позицию p и выход. 3. в цикле копируешь данные из p+k+i в p+i до тех пор, пока не встретится признак конца строки (его тоже надо скопировать). 4. выход |
Автор: babat 19.11.2011, 19:03 | ||
норм? |
Автор: bsa 20.11.2011, 23:13 |
babat, на данном уровне знания языка попрошу забыть о существовании оператора goto. Используй циклы (for(;;), while(){} или do{}while()) и continue/break. А потом, ты сильно отклонился от моего алгоритма. У меня циклы использовались обычные, без хитрых повторов. |
Автор: babat 22.11.2011, 18:10 | ||
ок,предположим что del сделали) хоть и не так,как ты сказал.Но вроде все работает,система тестов все проверяет-все норм. Перейдем к разбору других функций) зы спасибо огромное что помогаете)) strlen
норм? |
Автор: bsa 22.11.2011, 21:14 | ||
babat, видимо оператор goto ты так и не забыл. strlen3 наиболее близок к оптимальному решению (без оптимизаций по длине машинного слова):
|