Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Работа с текстом в ANSI C - функции substr,explode 
:(
    Опции темы
Dagger
Дата 13.12.2004, 16:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Экс. модератор
Сообщений: 377
Регистрация: 4.9.2002
Где: Киев

Репутация: нет
Всего: 8



Приходится учить С!
Поскольку я начинающий программист, то скажите пожалуйста где у меня что-то неверно или подскажите как эти функции можно решить более простым методом.

Все на ANSI C и меня (пока что!!!) мало волнует С++

Код однозначно где-то неверен. Только где - никак не могу разобраться.

Код

int substr(const char *str, char *buf, const long begin, const long end){
char *p = str;
char *p1 = buf;
long n = 0;

while(*p){
 if(n >= begin && n <= end){
  *p1++ = *p;
 }
 if(n >= end)break;
 n++;
 p++;
}
*p1 = 0;
return 0;
}
int sep_count(const char *sep, const char *str){
char *p = str;
int i = 0;
while(( p = strstr(p, sep) ) != NULL){
 p += strlen(sep);
 i++;
}
return i;
}
int explode(const char *sep, const char *str, char *buf[]){
char *p1, *p2, *prev;
long i = 0;

p1 = p2 = prev = NULL;

p1 = str;
prev = str;

while( ( p1 = strstr(p1, sep) ) != NULL){
 p2 = NULL;
 p2 = (char *)malloc(strlen(prev) - strlen(p1) + 1);
 memset(p2, '\0', sizeof(p2));
 substr(prev, p2, 0, strlen(prev) - strlen(p1) - 1);
 p1 += strlen(sep);
 prev = p1;
 buf[i] = p2;
 i++;
}
buf[i++] = prev;

return i;
}


PM MAIL WWW Skype   Вверх
azesmcar
Дата 13.12.2004, 16:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



Функция номер 1
Код

void substr(const char *str, char *buf, const unsigned long begin, const unsigned long end)
{
    if (!str || !buf)
    {
         return;
    }
    memcpy(buf, const_cast<char*>(str) + begin, end);
    buf[end] = '\0';
}

Если не охота использовать memcpy можешь написать свой функцию...

Это сообщение отредактировал(а) azesmcar - 13.12.2004, 17:02
PM   Вверх
Dagger
Дата 13.12.2004, 17:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Экс. модератор
Сообщений: 377
Регистрация: 4.9.2002
Где: Киев

Репутация: нет
Всего: 8



че это такое const_cast<char*>(str)+begin ??
имхо эта конструкция в С++ появилась?
Матюгается компилер
PM MAIL WWW Skype   Вверх
azesmcar
Дата 13.12.2004, 17:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



Функция номер 2
Код

int sep_count(const char *sep, const char *str)
{
if (!sep || !str)
{
 return 0;
}
int nSepSize = strlen(sep);
int nCount = 0;
for (unsigned int i = 0; i < strlen(str); ++i)
{
 if (memcmp((void*)(&str[i]), sep, nSepSize) == 0)
 {
  ++nCount;
 }
}
return nCount;
}


Добавлено @ 17:13
const_cast константность убирает, чтоб указателю можно было begin приплюсовать..вот только не помню точно он в С есть или нет...ну тогда просто убери из первого параметра префикс const

Код

void substr(char *str, char *buf, const unsigned long begin, const unsigned long end)
{
   if (!str || !buf)
   {
        return;
   }
   memcpy(buf, str + begin, end);
   buf[end] = '\0';
}


Добавлено @ 17:14
Ты уверен что он не на memcpy ругается??? включи в программу string.h
PM   Вверх
Dagger
Дата 13.12.2004, 17:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Экс. модератор
Сообщений: 377
Регистрация: 4.9.2002
Где: Киев

Репутация: нет
Всего: 8



не, короч все заработало. я эту шнягу с угловыми скобками убрал, оставил только (char *)str+begin - птому шо какая разница в условии const или не const оно должно быть передает что надо.

я жопой чую, что это в логике где-то перекрутил неверно.
дело в том, что я пришел из мира Perl.. потом был PHP.. сейчас жизнь хочет С...
раньше писал какие-то мелкие феньки, а тут сразу здоровый проект на С и надо
так что не удивляйтесь глупым и нерациональным решениям smile
Добавлено @ 17:24
функция №2 - твое решение реально быстрее того, что навял я? или как?
PM MAIL WWW Skype   Вверх
azesmcar
Дата 13.12.2004, 17:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



Твое решение вызывало strstr а как он работает я честно говоря понятия не имею...если уж из мира перла то наверняка у тебя и линукс присутствует, скомпилируй под линукс и запусти

time ./a.out

посмотри оба варианта, кто быстрее..но мое решение во всяком случае короче получилось...над оптимизацией честно говоря долго не думал...третью задачу завтра посмотрю..сегодня уже не успеть...
PM   Вверх
Dagger
Дата 13.12.2004, 18:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Экс. модератор
Сообщений: 377
Регистрация: 4.9.2002
Где: Киев

Репутация: нет
Всего: 8



ок, суперsmile
на серваке честно говоря лениво этим заниматься т.к. у меня компилер показывает время выполнения. Завтра постараюсь поглядеть на время, сейчас устал и дизайнюsmile

спасибо за помощь! жду дальнейших комментов!
PM MAIL WWW Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0490 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.