Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Подскажите про указатели и методы

11K
06 декабря 2006 года
elsuk
31 / / 23.10.2006
создаю класс String, необходимо найти подстроку(char или string) в строке типа String.
некоторая часть кода конструкторы и метод find
Код:
String::String(const char * s)
{
    len = std::strlen(s);
    str = new char[len + 1];
    std::strcpy(str, s);    
}

String::String()    
{
    len = 4;
    str = new char[1];
    str[0] = '\0';
}

char String::find(const char *str2)
{
  return (strstr(str, str2));
}
char String::find(const String *str2)
{
  return (strstr(str, str2));
}

вызываю например так
String str3,str1;

char c=str3.find(str1);
или так
char c=str3.find("1");

но мне выдает что invalid conversion from `char*' to `char'

как правильно сделать с указателями?
Заранее спасибо
5.4K
06 декабря 2006 года
Svyatozar
221 / / 11.09.2006
Как объявлена str?
должна быть объявлена так:
 
Код:
char *str;


Это что за безобразие:
 
Код:
char String::find(const String *str2)
{
  return (strstr(str, str2));
}

Может быть так?
 
Код:
char String::find(const String *str2)
{
  return (strstr(str, str2->str));
}


И потом, в какой строке invalid conversion from `char*' to `char'
1.8K
07 декабря 2006 года
k3Eahn
365 / / 19.12.2005
Дык strstr возвращает же не char, а char*.
547
07 декабря 2006 года
Hydra
488 / / 20.06.2006
Ну и делов-то
 
Код:
char String::find(const String *str2)
{
  return *(strstr(str, str2->str));
}
;)
5.4K
07 декабря 2006 года
Svyatozar
221 / / 11.09.2006
Цитата: Hydra
Ну и делов-то
 
Код:
char String::find(const String *str2)
{
  return *(strstr(str, str2->str));
}
;)


Тогда уж так:

 
Код:
char *String::find(const String *str2)
{
  return (strstr(str, str2->str));
}
309
07 декабря 2006 года
el scorpio
1.1K / / 19.09.2006
Hydra
И получаем первый найденный символ, использование которого весьма затруднительно :D

Правильнее будет так
 
Код:
const char* String::find(const String [n]&Other) const
{
  return strstr(str, Other.str));
}

1. Возвращаем константный указатель на первый символ найденной последовательности.
2. Так как класс String - это контейнер, то передавать указатель на него - абсурд. Передаём константную ссылку (&).
3. Так как метод Find не изменяет объект - делаем его константным.

Но в целях "инкапсуляции" рекомендуется скрывать char* - делаем закрытое поле fStr, а для доступа используем константный метод Pointer. Соответственно, результатом должен быть не адрес, а номер символа в строке.
 
Код:
int String::find(const String [n]&Other) const
{
  const char *res = strstr(fStr, Other.Pointer())); // Ищем совпадение
  return (res == NULL) ? -1 : (res - fStr); // Возвращаем -1 или номер символа
}
11K
09 декабря 2006 года
elsuk
31 / / 23.10.2006
ВСЕМ БОЛЬШОЕ СПАСИБО

теперь у меня опять проблема но уже в другом. тепеть надо заменить. вот часть кода
 
Код:
const char String::replace(const String &a,const String &b )
{
using namespace std;
string strr=str;
replace(strr.begin(),strr.end(), a , b);
const char *ch = strr.c_str();
return *ch;
}

вызываю так
const char *eee=str3.replace(str1,str2);

пишет ошибку
no matching function for call to `String::replace(__gnu_cxx::__normal_iterator<char*, std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, __gnu_cxx::__normal_iterator<char*, std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, const String&, const String&)'

как это понять, не соответствие типов или что?

Зарание Большое спасибо
11K
10 декабря 2006 года
elsuk
31 / / 23.10.2006
Добрые люди плиз подскажите че за ошибка
переписал но ошибка осталаст тажа
вот что стало
Код:
const char String::replace2(const String &a,const String &b )
{
char aa[a.len + 1];
char bb[b.len + 1];
std::strcpy(aa, a.str);
std::strcpy(bb, b.str);
std::string strr=str;
std::replace(strr.begin(),strr.end(), aa , bb);
const char *ch = strr.c_str();
return *ch;
}

ошибка по прежнему
no matching function for call to `replace(__gnu_cxx::__normal_iterator<char*, std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, __gnu_cxx::__normal_iterator<char*, std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, char[(((unsigned int)((int)a->String::len)) + 1u)], char[(((unsigned int)((int)b->String::len)) + 1u)])'

вначале думал что это совподение имен функций, но вроде поменял имена а ошибка осталась

Плиз help me
309
10 декабря 2006 года
el scorpio
1.1K / / 19.09.2006
Прошу прощения, но, судя по методу, ошибка где-то в ДНК :(
Скажите, уважаемый, зачем Вам надо свою писать оболочку на char, внутри которой будет использоваться другая оболочка - string :eek:
Ежели "для общего развития" - что вполне достойно - то не надо ТАК мухлевать.
Странный результат - зачем один символ???????
Цитата:
char aa[a.len + 1];
char bb[b.len + 1];


Даже если и прокатит - то будут проблемы с "переносимостью", размер стекового массива должен быть константой, определённой на момент компиляции.

11K
10 декабря 2006 года
elsuk
31 / / 23.10.2006
Цитата: el scorpio
зачем Вам надо свою писать оболочку на char, внутри которой будет использоваться другая оболочка - string


все просто. функция замены есть в string поэтому преобразую все для работы со string.

Цитата: el scorpio
Ежели "для общего развития" - что вполне достойно - то не надо ТАК мухлевать


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

Цитата: el scorpio
Даже если и прокатит - то будут проблемы с "переносимостью"


не очень хорошая новость, а др функции для замены символов в char есть? чтобы не переходить от char к string.

Заранее спасибо

11K
10 декабря 2006 года
elsuk
31 / / 23.10.2006
всем большое спасибо за помощь
пришлось все делать по другому, выкладываю код мало ли кому понадобится тоже самое
Код:
char * String::replace(const String& src, const String& dst) {
  char *text=str;
  const int src_len = src.len;
  const int  dst_len = dst.len;
  const char *p, *begin;
  char *r, *result;
   int count = 0;
  for (p = text; p = strstr(p, src.str); p += src_len) ++count;
  r = result = (char *)malloc(strlen(text) + (dst_len - src_len) * count + 1);
  begin = text;
  for (p = text; p = strstr(begin, src.str); begin = p + src_len) {
    strncpy(r, begin, p - begin);
    r += p - begin;
    strcpy(r, dst.str);
    r += dst_len;
  }
  strcpy(r, begin);
  return result;
}

тему можно считать закрытой
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог