//------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
//------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
int MaxSeriesLen = 0;
int CurrSeriesLen = 0;
AnsiString str = Edit1->Text;
char *s = str.c_str();
for (int i = 0; i < Edit1->Text.Length(); i++)
{
if (isalpha(s))
CurrSeriesLen = 0;
else
{
CurrSeriesLen += 1;
if (CurrSeriesLen > MaxSeriesLen)
MaxSeriesLen = CurrSeriesLen;
}
}
Edit2->Text = IntToStr(MaxSeriesLen);
}
//------------------------------------------------------------------------
Найти максимальное число серии символов отличных от букв
Код:
Несколько раз программа работала нормально, но потом стала выдавать неправельные результаты.
И теперь выдаёт только неправельные результаты.
Пример работы программы
Я ввожу в Edit1
25а
И в Edit2 получаю 3, а должен получить 2
Подскажите пожалуйста, где я ошибся
Если в место русской буквы "а" вводишь английскую букву "а" всё работает нормально.
во-вторых, зачем обращать s в char*?
в-третьих, сам должен понимать, что один и тот же код должен работать однозначно, если в нем нет случайных объектов;
проанализируй свой код по-шагам...
Код:
setlocale(LC_ALL, "");
и вместо
Код:
char *s = str.c_str();
Сделал так
Код:
unsigned char *s = str.c_str();
Вроде заработало и с русскими символами и с английскими.
Проверил 10 раз.
Это вообще правильно я сделал или это просто случайно выводятся правельные результаты, а потом пойдут опять неправельные результаты?
Цитата: zuze
и вместо
Код:
char *s = str.c_str();
Сделал так
Код:
unsigned char *s = str.c_str();
глянь как в хелпе по поводу c_str() написано:
[quote=BCB Help]
AnsiString::c_str() returns a non const temporary pointer to the internal string buffer in the AnsiString object. The pointer is invalid once the statement in which it is used has finished executing. [SIZE="4"]That is,don't do something like this:[/SIZE]
char* cp = Edit1->Text.c_str();
char* cp2 = strtok( cp, " \t\n" ); // cp may no longer be valid
If you need a persistent pointer, you MUST copy the string into its own buffer:
char* cp = new char[ Edit1->Text.Length() + 1 ];
strcpy( cp, Edit1->Text.c_str() );
[/quote]