электронные вязальные машины.
C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Получить два символы слева строки, Нужно получить два символа с левого края
Weihnachtsmann
Отправлено: 14.04.2004, 01:11


Не зарегистрирован







Нужно получить два символа с левого края имеющейся строки! Нужна функция типа бэйсиковской Left... Я чего-то совсем запутался! Как это можно сделать в C Builder'е?
Георгий
Отправлено: 14.04.2004, 02:06


Почетный железнодорожник

Группа: Модератор
Сообщений: 874



класс AnsiString метод substring тебе помогут
olegenty
Отправлено: 14.04.2004, 06:52


Ветеран

Группа: Модератор
Сообщений: 2412



CODE

AnsiString Left(AnsiString as, int iHowMeny)
{
   AnsiString asRes = "";
   if (as.Length() >= iHowMeny)
   {
       asRes = as.SubString(1, iHowMeny);
   } else
   {
       asRes = as.SubString(1, as.Length());
   }
   return asRes;
}


или

CODE

char* Left(char *sz, int iHowMeny)
{
   AnsiString asRes = "";
   AnsiString as = sz;
   if (as.Length() >= iHowMeny)
   {
       asRes = as.SubString(1, iHowMeny);
   } else
   {
       asRes = as.SubString(1, as.Length());
   }
   return asRes.c_str();
}

Gedeon
Отправлено: 14.04.2004, 08:34


Ветеран

Группа: Модератор
Сообщений: 1742



Или так
CODE

#include <StrUtils.hpp>

AnsiString YourText;
AnsiString Resalt = MidStr(YourText, 1, 2);

или еще так можно
CODE

#include <StrUtils.hpp>

AnsiString YourText;
AnsiString Resalt = LeftStr(YourText, 2);
Gedeon
Отправлено: 14.04.2004, 08:39


Ветеран

Группа: Модератор
Сообщений: 1742



2Olegenty
Честно говоря не понятно зачем Вы проверяете не больше ли число отрезаемых символов, чем длина слова, ф-ция SubStr() и так в этом случае вернет только то, что есть в этом слове.
olegenty
Отправлено: 14.04.2004, 09:34


Ветеран

Группа: Модератор
Сообщений: 2412



2Gedeon
навскидку нарисовал, скорее по привычке проверять. неправ. каюсь.
Aptem
Отправлено: 15.04.2004, 04:08


Мастер участка

Группа: Участник
Сообщений: 349



Товарищи! Все гораздо проще !!!!

CODE
AnsiString str2 = str1.SubString ( 0, 2 );


Где str1 — этоо строка из которой нужно извлечь 2 символа, а str2 — это и есть эти два символа !
DelphiN!
Отправлено: 15.04.2004, 07:49


Ученик-кочегар

Группа: Участник
Сообщений: 8



ё маё, ну вы ребята загнули, столько ответов, на такой вопрос...
Asher
Отправлено: 15.04.2004, 08:47


Мастер участка

Группа: Модератор
Сообщений: 550



QUOTE
ё маё, ну вы ребята загнули, столько ответов, на такой вопрос...

просто показали, что ты только копни... а там все что хочешь.

To Aptem:
А ты сам свой пример пробовал? Советую внимательно посмотреть на него и подумать, где ты Weihnachtsmann обманул wink.gif
Заодно посмотри на ответы Георгия и olegenty и попробуй определить где у тебя проще. biggrin.gif biggrin.gif biggrin.gif
Aptem
Отправлено: 16.04.2004, 03:46


Мастер участка

Группа: Участник
Сообщений: 349



QUOTE (Asher @ 15/04/2004, 09:49)
To Aptem:
А ты сам свой пример пробовал? Советую внимательно посмотреть на него и подумать, где ты Weihnachtsmann обманул wink.gif
Заодно посмотри на ответы Георгия и olegenty и попробуй определить где у тебя проще. biggrin.gif biggrin.gif biggrin.gif

Пробывал ! И где у меня косяк ??? Работает как часы !

Как я понял, нужно у имеющейся строки получить подстроку из 2-х символов слева ! Или задача совсем не в этом ?
Asher
Отправлено: 16.04.2004, 08:21


Мастер участка

Группа: Модератор
Сообщений: 550



QUOTE
Пробывал ! И где у меня косяк ??? Работает как часы !

Может сэр перестанет гнать и нервничать и все-таки наберет свой пример?
Увидит в отладчике, что str2 =NULL; и пойдет читать хелп, где написанно, чем отличается индексация элементов в паскале (откуда к нам пожаловал AnsiString) от индексации в С/С++;//
Aptem
Отправлено: 16.04.2004, 17:24


Мастер участка

Группа: Участник
Сообщений: 349



А теперь возьми и сам набери этот код:

CODE
void __fastcall TForm1::Button1Click(TObject *Sender)
{
 AnsiString str1, str2;

 str1 = "Hello";

 str2 = str1.SubString ( 0, 2 );

 ShowMessage ( str2 );
}


Вот, что показывает ShowMessage:
CODE

He
olegenty
Отправлено: 16.04.2004, 17:47


Ветеран

Группа: Модератор
Сообщений: 2412



предполагаю, что защита от неверного индекса успешно встроена в класс.

2Aptem: всё дело в том, что индексация AnsiString начинается с 1, а не с 0.
Asher
Отправлено: 16.04.2004, 18:01


Мастер участка

Группа: Модератор
Сообщений: 550



У меня в Builder 5 твой код, как и ожидалось, не показывает ничего.
Голое окошко с кнопкой ОК.
Возможно в BCppB6 эту защиту встроили. А толку?.
Наверное их за..ли приколы с ошибками у программеров, хотя как по мне, то это только исправление косяка с 0, а то что у народа и все остальные индексы могут быть сдвинутые — это типа х...ня.
"Интересный" подход.
Ладно — разборки пора закрывать. Надоело.
Aptem
Отправлено: 16.04.2004, 18:05


Мастер участка

Группа: Участник
Сообщений: 349



QUOTE (olegenty @ 16/04/2004, 18:49)
2Aptem: всё дело в том, что индексация AnsiString начинается с 1, а не с 0.

Но ты попробуй откомпилировать этот код, все работает !!!

olegenty
Отправлено: 16.04.2004, 18:15


Ветеран

Группа: Модератор
Сообщений: 2412



2Aptem: попробуй следующее:

AnsiString as = "Something";
ShowMessage(as[0]);
ShowMessage(as[1]);
ShowMessage(as[2]);
...
Иван
Отправлено: 17.04.2004, 20:40


Машинист паровоза

Группа: Участник
Сообщений: 207



Код
CODE
void __fastcall TForm1::Button1Click(TObject *Sender)
{
AnsiString str1, str2;

str1 = "Hello";

str2 = str1.SubString ( 0, 2 );

ShowMessage ( str2 );
}

работает,
и код
CODE

AnsiString as = "Something";
ShowMessage(as[0]);
ShowMessage(as[1]);
ShowMessage(as[2]);

тоже работает только кто объяснит что происходит на самом деле.
olegenty
Отправлено: 18.04.2004, 14:59


Ветеран

Группа: Модератор
Сообщений: 2412



только что попробовал

as[0] — даёт AccessViolation, что следует из кода сорца:

dstring.h, строки с 146 по 155
CODE

#else

   char& __fastcall operator [](const int idx)
   {
     ThrowIfOutOfRange(idx);   // Should Range-checking be optional to avoid overhead ??
     Unique();                 // Ensure we're not ref-counted
     return Data[idx-1];
   }

#endif
Admin
Отправлено: 18.04.2004, 15:32


Владимир

Группа: Администратор
Сообщений: 1190



Код

CODE

//---------------------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)
{
AnsiString str1, str2, str3;

str1 = "Hello";

str2 = str1.SubString ( 0, 2 );
str3 = str1.SubString ( 1, 2 );

ShowMessage ( str2 );
ShowMessage ( str3 );
if(str2 == str3) ShowMessage("==");

}
//---------------------------------------------------------------------------


работает, значит очень интересна реализация
метода SubString который это делает.

Код

CODE

AnsiString as = "Something";
//ShowMessage(as[0]);
ShowMessage(as[1]);
ShowMessage(as[2]);


не работает, выдает ERangeError, как и положено.
Иван
Отправлено: 19.04.2004, 22:25


Машинист паровоза

Группа: Участник
Сообщений: 207



Извиняюсь за некорректность,когда писал что код
CODE

AnsiString as = "Something";
ShowMessage(as[0]);
ShowMessage(as[1]);
ShowMessage(as[2]);



работает, имел ввиду что olegenty прав!!! wink.gif

Вернуться в Вопросы программирования в C++Builder