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));
}
Подскажите про указатели и методы
некоторая часть кода конструкторы и метод find
Код:
вызываю например так
String str3,str1;
char c=str3.find(str1);
или так
char c=str3.find("1");
но мне выдает что invalid conversion from `char*' to `char'
как правильно сделать с указателями?
Заранее спасибо
должна быть объявлена так:
Код:
char *str;
Это что за безобразие:
Код:
char String::find(const String *str2)
{
return (strstr(str, str2));
}
{
return (strstr(str, str2));
}
Может быть так?
Код:
char String::find(const String *str2)
{
return (strstr(str, str2->str));
}
{
return (strstr(str, str2->str));
}
И потом, в какой строке invalid conversion from `char*' to `char'
Дык strstr возвращает же не char, а char*.
Код:
char String::find(const String *str2)
{
return *(strstr(str, str2->str));
}
{
return *(strstr(str, str2->str));
}
Цитата: Hydra
Ну и делов-то
;)
Код:
char String::find(const String *str2)
{
return *(strstr(str, str2->str));
}
{
return *(strstr(str, str2->str));
}
Тогда уж так:
Код:
char *String::find(const String *str2)
{
return (strstr(str, str2->str));
}
{
return (strstr(str, str2->str));
}
И получаем первый найденный символ, использование которого весьма затруднительно :D
Правильнее будет так
Код:
const char* String::find(const String [n]&Other) const
{
return strstr(str, Other.str));
}
{
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 или номер символа
}
{
const char *res = strstr(fStr, Other.Pointer())); // Ищем совпадение
return (res == NULL) ? -1 : (res - fStr); // Возвращаем -1 или номер символа
}
теперь у меня опять проблема но уже в другом. тепеть надо заменить. вот часть кода
Код:
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;
}
{
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&)'
как это понять, не соответствие типов или что?
Зарание Большое спасибо
переписал но ошибка осталаст тажа
вот что стало
Код:
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;
}
{
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
Скажите, уважаемый, зачем Вам надо свою писать оболочку на char, внутри которой будет использоваться другая оболочка - string :eek:
Ежели "для общего развития" - что вполне достойно - то не надо ТАК мухлевать.
Странный результат - зачем один символ???????
Цитата:
char aa[a.len + 1];
char bb[b.len + 1];
char bb[b.len + 1];
Даже если и прокатит - то будут проблемы с "переносимостью", размер стекового массива должен быть константой, определённой на момент компиляции.
Цитата: el scorpio
зачем Вам надо свою писать оболочку на char, внутри которой будет использоваться другая оболочка - string
все просто. функция замены есть в string поэтому преобразую все для работы со string.
Цитата: el scorpio
Ежели "для общего развития" - что вполне достойно - то не надо ТАК мухлевать
мухлевать приходится так как еще не очень хорошо знаю язык, поэтому приходится брать готовые куски кода и редактировать на свой лад, правда не очень получается, но все же пытаюсь.
Цитата: el scorpio
Даже если и прокатит - то будут проблемы с "переносимостью"
не очень хорошая новость, а др функции для замены символов в char есть? чтобы не переходить от char к string.
Заранее спасибо
пришлось все делать по другому, выкладываю код мало ли кому понадобится тоже самое
Код:
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;
}
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;
}
тему можно считать закрытой