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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Работа со строкой в С++, Реализация строки 
:(
    Опции темы
clarkkent
Дата 15.5.2008, 10:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 19
Регистрация: 22.3.2008

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



Доброе утро! Очень нужна ваша помощь! 
Я реализовал класс со строками так, все вроде ничего, только я хочу чтобы если ещё раз вызвав конкатенацию, добавлять новое введенное мной слово в уже новое слово, а не в изначальное ( до первой попытки конкатенации) ??
Код

#include "stdio.h"
#include "string.h"
#include "stdlib.h"
#include "conio.h"
#include "iostream.h"

class string
{
  public:
  string (char what) ;
  string strcat(char * source);
  string str(char what);
  void print_at(unsigned x,unsigned y);
  private:
 char * buf;
 unsigned len;
};

string::string(char what)
{ buf=new char[2];
  len=1;
  buf[0]=what;
  buf[1]=0;
}

void string::print_at(unsigned x,unsigned y)
{ gotoxy(x,y);
  cout <<buf;
}


string string::strcat (char * source)
{ len+=strlen(source);
  ::strcat(buf, source);
  return *this;
}

string string::str(char what)
{
 char *temp=buf;
 len=1;
 buf=new char[len+1];
 strcpy(buf,temp);
 ::strcat(buf,temp);
// delete [] temp;
 return *this;
 }

void main()
{ int ans,x1,y1;
  char what;
  clrscr();
  cout << "input word:";
  while (ans!=3)
  { cout<<" 1 - Insert word" <<'\n';
    cout<<" 2 - Concat word" <<'\n';
    cout<<" 3 - Write word" <<'\n';
    cin >> ans;
    switch(ans)
  {
   case 1:

      { clrscr();
    cout <<"Vvedite bukvy:"<<'\n';
    cin >> what;
    cout <<"Vvedite koord:"<<'\n';
    cout <<"Vvedite x:"<<'\n';
    cin >> x1;
    cout <<"Vvedite y:"<<'\n';
    cin >> y1;
      string str(what);
      str.str(what);
      str.print_at(10,11);

      break;
   }
    case 2:

   { clrscr();
    char* test = "t";
    string str('r');
    cout <<"Vvedite slovo:"<<'\n';
    cin >> test;
    cout <<"Vvedite koord:"<<'\n';
    cout <<"Vvedite x:"<<'\n';
    cin >> x1;
    cout <<"Vvedite y:"<<'\n';
    cin >> y1;
    str.strcat(test);
    str.print_at(x1,y1);
    str.strcat(test);
    str.print_at(x1,y1+2);
   break; }
   case 3:
   {
    break;
   }
   }
   } ;


 getchar();
}


Это сообщение отредактировал(а) archimed7592 - 15.5.2008, 12:26
PM MAIL   Вверх
pilotnet
Дата 15.5.2008, 10:42 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 43
Регистрация: 22.4.2008

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



Хрень какая , столько ошибок  smile 

используйте std::string
PM MAIL   Вверх
archimed7592
Дата 15.5.2008, 13:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 6
Всего: 93



pilotnet, все мы когда-то учились и у всех нас бывало и побольше ошибок, не так ли?


Цитата(clarkkent @  15.5.2008,  10:04 Найти цитируемый пост)
string string::strcat (char * source)
{ len+=strlen(source);
  ::strcat(buf, source);
  return *this;
}

Нужно что-то вроде этого:
Код

{
  len+=strlen(source);
  char *tmp = new char[len + 1];
  strcpy(tmp, buf);
  ::strcat(tmp, source);
  // где-то здесь ещё память освободить нужно, но, боюсь, что для твоего класса это будет фатально :)
  buf = tmp;
  return *this;
}


Это сообщение отредактировал(а) archimed7592 - 15.5.2008, 13:03


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
clarkkent
Дата 15.5.2008, 14:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 19
Регистрация: 22.3.2008

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



archimed7592, спасибо, но как в void main() реализовать -я нажимаю при запуске на клавишу 2, тем самым ещё раз вызвав конкатенацию, добавлять новое введенное мной слово в уже новое слово, а не в изначальное ( до первой попытки конкатенации)???
PM MAIL   Вверх
archimed7592
Дата 15.5.2008, 16:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 6
Всего: 93



Цитата(clarkkent @  15.5.2008,  14:20 Найти цитируемый пост)
тем самым ещё раз вызвав конкатенацию, добавлять новое введенное мной слово в уже новое слово, а не в изначальное ( до первой попытки конкатенации)??? 

clarkkent, я не совсем тебя понимаю. Давай более подробно, с ссылками на номера строк кода, с пояснением какой результат получается и, в свою очередь, какой результат ты хотел бы лицезреть...


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
bsa
Дата 15.5.2008, 22:16 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



На мой взгляд, рациональней класс string написать так:
Код
class String
{
public:
   String(char value = '\0') : buffer(new char[2]), size_(1) {
       buffer[0] = value;
       buffer[1] = '\0';
   }
   ~String() {
       delete []buffer;
   }
   const char *c_str() const {
       return buffer;
   }
   void strcat(const char *text) {
       unsigned asize = strlen(text);
       char *tmp = new char[asize + size_ + 1]
       memcpy(tmp, buffer, size_);
       memcpy(tmp + size_, text, asize);
       size_ += asize;
       tmp[size_] = '\0';
       delete []buffer;
       buffer = tmp;
   }
   void strcpy(const char *text) {
       unsigned nsize = strlen(text);
       if (nsize > size_) {
          delete []buffer;
          buffer = new char[nsize+1]
       }
       memcpy(buffer, text, nsize+1);
   }
   void strcat(char symbol) {
       const char text[2] = { symbol, '\0' };
       strcat(text);
   }
private:
   char *buffer;
   unsigned size_;
};
И никакие методы print_at делать не надо. Делай их внешними функциями (и используй метод c_str()).
PM   Вверх
clarkkent
Дата 16.5.2008, 15:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 19
Регистрация: 22.3.2008

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



archimed7592, про конкатенацию забудь, мне нужно реализовать 3 метода класса строк с таким видом класса! Очень нужна помощь!
Код

class string
{
  public:
  string (char what) ;
  string strcat(char * source);
  string str(char what);
  void print_at(unsigned x,unsigned y);
  private:
 char * buf;
 unsigned len;
};

конечно лучше ещё деструктор добавить в класс, конструктор копии..
PM MAIL   Вверх
bsa
Дата 16.5.2008, 20:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



clarkkent, чем мой вариант не устраивает? В нем только конструктора копирования не хватает.
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


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

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


 




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


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

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