![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
|
Опции темы | Поиск в этой теме |
![]() |
#1 |
Пользователь
Регистрация: 21.02.2010
Сообщений: 27
|
![]()
Всем доброго времени суток.
Пишу вот библиотеку для работы со строками. Функции strcopy и strlength работают нормально, а concat и reverse - некорректно. Найти ошибку не могу ![]() Заранее спасибо. P.S. Сорри что нет комментариев, но я думаю и без них здесь можно разобраться. Код библиотеки: Код:
|
![]() |
![]() |
![]() |
#2 |
Форумчанин
Регистрация: 14.12.2009
Сообщений: 716
|
![]()
Попробуй такой вариант реверса
Код:
|
![]() |
![]() |
![]() |
#3 | |
Пользователь
Регистрация: 21.02.2010
Сообщений: 27
|
![]() Цитата:
![]() |
|
![]() |
![]() |
![]() |
#4 |
Форумчанин
Регистрация: 14.12.2009
Сообщений: 716
|
![]()
Ты же s1 инициализируешь уже в самом начале, когда аргументом его передаешь в функцию.
Выделяй память под новую строку, с размером 1, 2 строки, и только потом копируй слова. |
![]() |
![]() |
![]() |
#5 | |
Пользователь
Регистрация: 21.02.2010
Сообщений: 27
|
![]() Цитата:
думал сделать так: Код:
Через динамику делать, мне кажется, не желательно, т.к. это библиотека и работать она должна работать максимально быстро. Может можно это как-то проще сделать... Последний раз редактировалось Stilet; 19.10.2010 в 13:23. |
|
![]() |
![]() |
![]() |
#6 |
Старожил
Регистрация: 21.03.2009
Сообщений: 2,193
|
![]()
1. Тут нужно использовать динамическое выделение памяти. malloc для Си, new для C++.
2. Не забывайте о нулевом символе в конце строки. Размер массива должен быть равен len+1 (len символов + символ '\0'). У меня из-за этого недавно были весьма-а-а мозголомные проблемы при освобождении памяти, когда забыл поставить +1... Ну и еще - указывайте все-таки тип функций (тут вообще лучше void) - "неявный int" является плохим стилем, и даже не знаю, поддерживается ли C99. Стандартом C++ не поддерживается точно.
Простые и красивые программы - коды программ + учебник C++
Создание игры - взгляд изнутри - сайт проекта Тема на форуме, посвященная ему же |
![]() |
![]() |
![]() |
#7 | |
Пользователь
Регистрация: 21.02.2010
Сообщений: 27
|
![]() Цитата:
Код:
вот не пойму почему так ![]() а с типом функции понял) спасибо Последний раз редактировалось kloffelin; 18.10.2010 в 21:57. |
|
![]() |
![]() |
![]() |
#8 | |
Старожил
Регистрация: 21.03.2009
Сообщений: 2,193
|
![]()
Знаете, переделайте лучше все через указатели char*, а не char[]. Тогда strcat (если я правильно понял, в результате strcat(s1, s2) для s2 фактически получаем s2 = s1 + s2) будет примерно такой:
Код:
1. Не стоит производить вычисления длин строк при каждой итерации цикла. Лучше заранее сохранить эти значения в переменные. 2. while (i < len1) как-то более традиционно для C/C++, чем while (i != len1). Тем более что вдруг в теле цикла i увеличивается более чем на 1. 3. Запись str[j++] = s1[i++] позволяет убрать две лишние строчки из кода, т.к. постфиксный инкремент все равно возвращает значение, которое было до увеличения переменной. 4. Не забываем добавить в конец нулевой символ. 5. При использовании указателей нам нет необходимости держать строку s2 излишне большого размера только чтобы потом мы смогли туда поместить элементы еще одной строки. Памяти всегда расходуется столько, сколько надо, ни больше и не меньше. Да и копирования из str в s2 не нужно - мы просто присваиваем одному указателю значение другого. 6. Ну а раз тип функции void, то return в конце функции нам не нужен. Цитата:
Код:
Иногда это проходит безнаказанно, а иногда и нет. Так что с указателями придется постоянно быть настороже и внимательно следить за тем, чтобы они не залезли куда не просят.
Простые и красивые программы - коды программ + учебник C++
Создание игры - взгляд изнутри - сайт проекта Тема на форуме, посвященная ему же |
|
![]() |
![]() |
![]() |
#9 | ||
C++ hater
Старожил
Регистрация: 19.07.2009
Сообщений: 3,333
|
![]()
2Гром
Цитата:
Цитата:
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay
My other car is cdr. Q: Whats the object-oriented way to become wealthy? A: Inheritance Последний раз редактировалось pproger; 19.10.2010 в 14:03. |
||
![]() |
![]() |
![]() |
#10 | |||
Старожил
Регистрация: 21.03.2009
Сообщений: 2,193
|
![]() Цитата:
Цитата:
Или мы передаем в качестве параметра реальный размер? А почему в стандарте не передаем? Или вообще плюем на параметр и strlen и лепим все как есть в чужую память? Вот как сделать strcat("Hello, ", "world!") (естественно, вместо строковых литералов нормальные переменные, но это длиннее писать) без выделения дополнительной памяти? Если никак, то на кой оно нам вообще надо? Цитата:
Код:
Простые и красивые программы - коды программ + учебник C++
Создание игры - взгляд изнутри - сайт проекта Тема на форуме, посвященная ему же |
|||
![]() |
![]() |
![]() |
|
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
XMLGear - библиотека для полноценной работы с XML | igorsolkin | Общие вопросы по Java, Java SE, Kotlin | 0 | 16.04.2010 17:53 |
Библиотека для WINAPI для работы с ORACL | Golovastik | SQL, базы данных | 2 | 02.03.2010 19:42 |
Библиотека, расширяющая функции для работы с текстом (Delphi) | a_n_n_a | Помощь студентам | 3 | 28.04.2009 10:42 |
Библиотека для работы с *.psd-файлами. | vinni | Мультимедиа в Delphi | 3 | 23.10.2008 20:29 |
HELP!Си - программа для работы со строками + сумма строк в матрице! | DUPLET | Помощь студентам | 1 | 20.12.2007 21:16 |