Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Массив элементов типа AnsiString


Автор: Voldemar2004 6.6.2006, 13:52
Есть в C++ Builder'e такой тип AnsiString, который сам заботится о выделении памяти. Какая ему соответствует библиотека в Ansi C++? Хотя посмотрел в хелпе:
Цитата
AnsiString is the C++Builder analog for the Delphi long string type.
Цитата
AnsiString - это аналог типа long string для Delphi.


У меня не получается сделать функцию наподобие этой:
Код
AnsiString *clause(char *a, int j)
{

/* код */

return &buffer[0];
}
По идее она должна считывать каждое предложение, разделенное "?.!" в отдельный элемент массива типа AnsiString. При вызове clause(" A. B. C.", 2) должна выводить "В".

Код
//---------------------------------------------------------------------------
#include <iostream.h>
#include <conio.h>

#include <vcl.h>
//---------------------------------------------------------------------------

void main(void)
{

char *delimiter = "?!.";

int n=3; /* Число предложений. */

char *a = " A! B. C?"; /* Предложения. */

        AnsiString *buffer = new AnsiString [n];

        int i=0;

        for(int j=0; j<n; j++)
        {
                while( delimiter[0] != a[i-1] && delimiter[1] != a[i-1] && delimiter[2] != a[i-1] )
                {
                buffer[j] += a[i]; i++;
                }
                i++;

        cout<<buffer[j]<<'\n';
        }

        delete[] buffer;

delete a;

getch();
}
 

Автор: _hunter 6.6.2006, 14:24
в ANSI этому классу (а не типу) соответствует string (std::string) из String.h 

Автор: _hunter 6.6.2006, 15:15
это можно руками сделать -- заменить "|" на "\n" 

Автор: Voldemar2004 6.6.2006, 18:34
_hunter, я спрашивал про то, как сделать функцию, которая бы возвращала ссылку на нулевой элемент массива. 

Я спрашивал вот про что:
Код
//---------------------------------------------------------------------------    
#include <iostream.h>    
#include <conio.h>    
#include <vcl.h>    
//---------------------------------------------------------------------------

void main(void)
{
char *delimiter = "?!.";  /* Массив разделителей. */

int n=3; /* Число предложений. */

char *a = " A!   B. C?"; /* Само предложение. */

        AnsiString *buffer = new AnsiString [n];

        int i=0, j;
        for(j=0; j<n; j++)
        {
                while( delimiter[0] != a[i-1] && delimiter[1] != a[i-1] && delimiter[2] != a[i-1] )
                {
                buffer[j] += a[i]; i++;
                }
                i++;

        }

        for(int i=0; i<3; i++) cout<<buffer[i]<<'\n'; /* Вывод полученного массива. */

        delete[] buffer;

getch();
}
Как сделать функцию, чтобы она при вызове например 
Код
cout<<split(" A!   B. C?", 2)
 - выводила "В.". Ну то есть, функция в своем теле крутит этот массив символов, каждое предложение записывается в отдельный элемент массива типа AnsiString, а при вызове пользователь заводит предложения и номер элемента (предложения) - и соответственно происходит вывод этого элемента массива. 

Автор: _hunter 6.6.2006, 18:57
а я следовал правилу "один топик -- один вопрос."...
так же неплохо бы следовать правилу "о минимализации тестового кода"

P.S.
после второго "пояснения" я стал понимать проблему еще меньше... 

Автор: Earnest 6.6.2006, 19:03
Voldemar2004, тебе ведь уже ответили: используй std::string. Конечно, интерфейс другой, но все что тебе надо, там есть. Если ты хочешь, чтобы тебе билдеровский код переписали через string, то это в Центр помощи. 

Автор: Voldemar2004 6.6.2006, 20:19
Не надо мне переписывать билдеровский код. Если все настаивают smile , то буду делать через std::string.  

Автор: Voldemar2004 6.6.2006, 21:47
Все! Я сделал все сам. Для начала сделал вот такой набросок:
Код
#include <iostream.h>
#include <conio.h>

int arr(int *array)
{
 return *array;
}

void main(void)
{
const int n=5;
int a[n] = {1,2,3,4,5};

for(int i=0; i<n; i++) cout << arr( (a+i)) << '\n';

getch();
}

Функция возвращает указатель на 1-ый элемент массива (по умолчанию).

А дальше по подобию:
Код
 #include <string>
 #include <conio>

 using namespace std; /* Пространство имен std. */

 int clause_count(char *);

 string split(char *a, int j)
 {
 char *delimiter = "?!."; /* Массив разделителей. */

     /* Число элементов в этом массиве = числу предложений. */
    string *buffer = new string[ clause_count(a) ];

        int i=0;

        for(int j=0; j<clause_count(a); j++)
        {
                while( delimiter[0] != a[i-1] && delimiter[1] != a[i-1] && delimiter[2] != a[i-1] )
                {
                /* Запись в каждый элемент массива нового предложения. */
                buffer[j] += a[i]; i++;
                }
                i++;
        }

    return buffer[j];

 }


 void main(void)
 {
 /* Вот какой результат требуется: */
 cout << split("May.     June!                July?", 2) << '\n';
 cout << split("May.     June!                July?", 1) << '\n';
 cout << split("May.     June!                July?", 0) << '\n';
 getch();

 }

/* Функция определения количества предложений в тексте. */
int clause_count(char *a)
{
/* Символы-разделители, по которым определяется конец предложения. */
char *split = ".!?";

int i=0, clause=0;

        do
        {
                for(int j=0; j<3; j++)
                {
                        if( a[i]==split[j] ) clause++;
                }
        i++;
        }
        while( i!= strlen(a) );
return clause;
}

P.S. А функцию определения количества предложений в тексте я буду еще доделывать, так что не критикуйте строго. smile  

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)