Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > Преобразование строки в массив (C++)


Автор: YuryShabalin 16.2.2012, 15:20
Здравствуйте, уважаемые!
Я новичок в C++, и при решении такой задачи у меня возникли трудности:
В поле Edit4 вводим текст на русском языке,длинной 16 символов, далее нам необходимо в соответствии с определённой таблицей перевести этот текст в массив из шестнадцатеричных чисел ( для дальнейшего удобства их использования). у меня получилось следующее:

Код:
Код



void __fastcall TForm1::Button3Click(TObject *Sender)
{
AnsiString Rus = "абвгдеёжзийклмнопрстуфхцчшщыьъэюя"
                 "АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЫЬЪЭЮЯ" ;
AnsiString Eng[66] = { "01", "02", "03", "04", "05", "06", "07", "08", "09", "0A",  "0B", "0C", "0D", "0E", "0F",
                       "10", "11","12", "13", "14", "15", "16", "17", "18", "19","1A", "1B", "1C", "1D", "1E", "1F",
                        "20", "21",
                        "01", "02", "03", "04", "05", "06", "07", "08", "09", "0A", "0B", "0C", "0D", "0E", "0F",
                       "10", "11","12", "13", "14", "15", "16", "17", "18", "19","1A", "1B", "1C", "1D", "1E", "1F",
                        "20", "21"};  //Собственно эта таблица
AnsiString S1 = Edit4->Text; //Замена русского текста в соотв. с таблицей
AnsiString S2;
int Ind;
 for (int i=1; i<= S1.Length(); i++)
  if (Ind = Rus.Pos(S1[i]))
   S2 += Eng[Ind - 1];
  else S2 += S1[i];

Edit5->Text = S2;            //Вывод полученного значения


Таким образом при введении 16 русских букв у меня получается строка из 32 символов. Мне же необходимо получить ещё и массив из 16 элементов. То есть, если я введу "АБВ" то мне нужно получить массив,первым элементом которого будет: "01", вторым "02" третьим "03" и всё это в шестнадцатеричном формате.
Надеюсь я всё нормально объяснил)) Спасибо, буду ждать помощи и советов! 

Автор: t_gran 17.2.2012, 08:01
YuryShabalin, а зачем вводить массив Eng? Можно же и без него спокойно обойтись. Ведь по сути, эти числа есть порядковые номера только представленные а hex-виде. Так может просто хранить в массиве индекс буквы, а как только необходимо будет её показать, вы сразу же конвертнёте dec->hex. Ну к примеру вот так:
Код

#include <iostream>
#include <iomanip>
#include <string>
#include <vector>

using namespace std;

int main()
{
   // Ваша таблица
   const string rus = "абвгдеёжзийклмнопрстуфхцчшщъыьэюя"
                      "АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЫЬЪЭЮЯ";

   string text = "аБв";
   // Тут будем хранить результат
   vector<size_t> array;

   size_t ind;

   for (size_t i=0; i<text.size(); ++i)
   {
      // Если находим знакомую букву
      if ((ind = rus.find(text[i])) != string::npos)
      {
         // Добавляем её порядковый номер в массив.
         // Т.к. нам регистр не важен, то пользуемся только
         // первой частью таблицы.
         array.push_back((ind+1) % 33);
      }
   }

   // Выводим значения массива в hex виде
   for (size_t i=0; i<array.size(); ++i)
   {
      // Добавляем ноль если нужно
      cout << ((array[i]<0xF) ? "0" : "") << hex << array[i];
   }
   cout << endl;

   return 0;
}

http://s1.ipicture.ru/

Автор: YuryShabalin 17.2.2012, 21:59
t_gran, Спасибо огромное,что откликнулись! Только вот такая проблема,мне нужно,что бы в массиве хранились именно Hex значения и так,как в таблице...
 Показывать можно и через String,это не принципиально, главное чтобы в массиве были такие элементы(табличные 01 02 и тд),чтобы в дальнейшем с ним работать! 

Автор: t_gran 20.2.2012, 04:12
YuryShabalin, ну если даже так, то в чём проблема? Делайте так:
Код

#include <iostream>
#include <string>
#include <vector>

using namespace std;

int main()
{
   const string CRus = "абвгдеёжзийклмнопрстуфхцчшщъыьэюя"
                       "АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЫЬЪЭЮЯ";

   const string CEng[66] = {"01", "02", "03", "04", "05", "06", "07", "08", "09", "0A", "0B",
                            "0C", "0D", "0E", "0F", "10", "11", "12", "13", "14", "15", "16", 
                            "17", "18", "19", "1A", "1B", "1C", "1D", "1E", "1F", "20", "21",
                            "01", "02", "03", "04", "05", "06", "07", "08", "09", "0A", "0B",
                            "0C", "0D", "0E", "0F", "10", "11", "12", "13", "14", "15", "16",
                            "17", "18", "19", "1A", "1B", "1C", "1D", "1E", "1F", "20", "21"};                      
                      
   string text = "аБв";

   vector<string> array;

   size_t ind;

   for (size_t i=0; i<text.size(); ++i)
   {
      if ((ind = CRus.find(text[i])) != string::npos)
      {
         array.push_back(CEng[ind]);
      }
   }

   for (size_t i=0; i<array.size(); ++i)
   {
      cout << array[i];
   }
   cout << endl;

   return 0;
}

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