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 обманул
Заодно посмотри на ответы Георгия и olegenty и попробуй определить где у тебя проще.
|
|
Aptem |
Отправлено: 16.04.2004, 03:46 |
|
Мастер участка
Группа: Участник
Сообщений: 349
|
QUOTE (Asher @ 15/04/2004, 09:49) | To Aptem:
А ты сам свой пример пробовал? Советую внимательно посмотреть на него и подумать, где ты Weihnachtsmann обманул
Заодно посмотри на ответы Георгия и olegenty и попробуй определить где у тебя проще. |
Пробывал ! И где у меня косяк ??? Работает как часы !
Как я понял, нужно у имеющейся строки получить подстроку из 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:
|
|
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 прав!!!
|
|