Отзеркаливание строки - Ansistring - трабл!

Тема в разделе "Borland C++ Builder & Kylix", создана пользователем Trikster, 11 ноя 2007.

Статус темы:
Закрыта.
  1. Trikster

    Trikster Гость

    Нид хэлп!

    Надо зеркально перевернуть строку символов (как для палиндрома)

    Вот код:

    char *a, *b, *c, d;

    a=Edit3->Text.c_str();
    for(b=c=a;*(c+1)!=NULL;c++);
    while(b<c)
    {
    d=*b;
    *b++=*c;
    *c--=d;
    }
    Edit3->Text=AnsiString(a);

    Со строками типа char всё работает без вопросов.
    А вот при преобразовании обратно в AnsiString в случае, если в строке нечётное количество символов (не считая концевого "\0") пропадает символ, который был первым в исходной строке...
    Ниччего не понимаю!...
     
  2. Blackheart1983

    Blackheart1983 Гость

    на сколько я понимаю надо было массив символов const char * просто зеркально отразить и преобразовать в обратно в AnsiString
    если так то алгоритм такой
    преобразовать в const char *
    сделать 2 указателя char на первый и последний элементы
    проверить есть ли остаток от деления четное или нет кол-во символов
    запустить в цикле до abs(strlength/2) менять местами содержимое указателей и делать сдвиг
    Edit1->text=const char*;
    всё
     
  3. Trikster

    Trikster Гость

    Ну а я что делаю?
    И... а зачем на чётность-то проверять?
    Просто ставишь указатели по концам и меняешь символы пока один указатель меньше другого - всё.
    Проблема-то не в этом, а в том что при обратном преобразовании в AnsiString начинаются непонятки...

    Более того, без конвертации AnsiString - char и обратно - всё работает...
     
  4. European

    Регистрация:
    4 сен 2006
    Сообщения:
    2.580
    Симпатии:
    0
    Для: Blackheart1983
    Может сначала разобрался бы в проблеме?

    Для: Trikster
    Насколько я помню, свойство Text возвращает временный объект, поэтому никто не гарантирует сохранности данных.
    Попробуй вот такой вариант:
    char *a, *b, *c, d;

    Код (Text):
    AnsiString SomeText = Edit3->Text;
    a=SomeText.c_str();
    for(b=c=a;*(c+1)!=NULL;c++);
    while(b<c)
    {
    d=*b;
    *b++=*c;
    *c--=d;
    }
    Edit3->Text=AnsiString(a);
    P.S. Хелпа Билдера под рукой нет, так что могу ошибится
     
  5. sdriver

    sdriver Гость

    std::reverse
     
Загрузка...
Статус темы:
Закрыта.

Поделиться этой страницей