Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Найти максимальное число серии символов отличных от букв

11K
07 апреля 2008 года
zuze
84 / / 07.03.2008
Я написал такой код

Код:
//------------------------------------------------------------------------

#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

Подскажите пожалуйста, где я ошибся
11K
07 апреля 2008 года
zuze
84 / / 07.03.2008
Если в место русской буквы "а" вводишь английскую букву "а" всё работает нормально.
1.9K
07 апреля 2008 года
Anton Chik
175 / / 26.09.2005
во-первых, учись формулировать вопросы, потому что сразу трудно врубиться что тебя интересует "максимальная длина серии символов..."
во-вторых, зачем обращать s в char*?
в-третьих, сам должен понимать, что один и тот же код должен работать однозначно, если в нем нет случайных объектов;
проанализируй свой код по-шагам...
11K
07 апреля 2008 года
zuze
84 / / 07.03.2008
Я добавил в начало программы

 
Код:
setlocale(LC_ALL, "");


и вместо

 
Код:
char *s = str.c_str();


Сделал так

 
Код:
unsigned char *s = str.c_str();


Вроде заработало и с русскими символами и с английскими.
Проверил 10 раз.

Это вообще правильно я сделал или это просто случайно выводятся правельные результаты, а потом пойдут опять неправельные результаты?
11
07 апреля 2008 года
oxotnik333
2.9K / / 03.08.2007
Цитата: 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]

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог