Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Циклы в программе поиска и замены слов. Помогите, пожалуйста, исправить код. 
:(
    Опции темы
Hysteria
Дата 14.5.2007, 16:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 19
Регистрация: 14.5.2007

Репутация: нет
Всего: нет



Здравствуйте)
Программа по заполнению шаблонов.В входном файле находит слова в квадратных скобках и заменяет их на то, что нужно.
Например.Шаблон: Меня зовут [name], мне [years] лет.Вводим в форме только Вася, 12, все расставляется по местам.Шаблон, а следственно, и количество слов в скобах изменяется (пользователь указывает это число в первой форме).И все вроде бы работает, НО.В выходном текстовом файле указывает то "Меня зовут Вася 12, мне Вася 12 лет", то еще какю-нибудь гадость.У меня глаз совсем замылился, так что

Прошу помочь исправить ошибку в коде!Пожалуйста.Желательно до завтрашнего вечера.
Спасибо)

Код

while (st[n])
 {
    if (st[n] != '[')
    fprintf(in, "%c", st[n]);
    else
    {
             for(int i=0; i<=Form2->ControlCount; ++i)
        {
        TEdit *ctrl = dynamic_cast<TEdit *>(Form2->Controls[i]);
        if(ctrl)
        {
       fprintf(in, " %s ", ctrl->Text.c_str());
       while( (st[n]!=']') && (st[n]!='\0') )
          n++;
     }} }
     n++;
 }



Это сообщение отредактировал(а) Hysteria - 14.5.2007, 17:19
PM MAIL   Вверх
Klin
Дата 14.5.2007, 16:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1938
Регистрация: 7.10.2002
Где: Краснодар

Репутация: 20
Всего: 25



эх, будем помогать smile


--------------------
Я человек - попробуйте обвинить меня за это.
PM MAIL   Вверх
Hysteria
Дата 14.5.2007, 16:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 19
Регистрация: 14.5.2007

Репутация: нет
Всего: нет



Klin, буду очень благодарна  smile 
PM MAIL   Вверх
Klin
Дата 14.5.2007, 17:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1938
Регистрация: 7.10.2002
Где: Краснодар

Репутация: 20
Всего: 25



Что-то код у тебя запутанный smile 
Код

 AnsiString temp = Memo1->Text;
 temp = temp.Insert("Вася",temp.Pos("[name]"));
 temp = temp.Delete(temp.Pos("[name]"),6);
 temp = temp.Insert("12",temp.Pos("[years]"));
 temp = temp.Delete(temp.Pos("[years]"),7);
 Memo1->Text= temp;


Добавлено через 2 минуты и 7 секунд
Если вариатов больше, то так:

Код

 AnsiString data[3] = { "[name]","[years]", "[place]" } ,
            newdata[3] = {"Вася", "12", "дома" };

 AnsiString temp = Memo1->Text;
 for (int i = 0; i<=2; i++)
  if (temp.Pos(data[i])!=0) {
   temp = temp.Insert(newdata[i],temp.Pos(data[i]));
   temp = temp.Delete(temp.Pos(data[i]),data[i].Length());
  }
 Memo1->Text = temp;



--------------------
Я человек - попробуйте обвинить меня за это.
PM MAIL   Вверх
Hysteria
Дата 14.5.2007, 17:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 19
Регистрация: 14.5.2007

Репутация: нет
Всего: нет



Klin,  ничего у меня не запутанно, у меня универсально, ведь слов в скобках слов может быть до 50, и они могут быть разными, тут константами нельзя.
PM MAIL   Вверх
Klin
Дата 14.5.2007, 18:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1938
Регистрация: 7.10.2002
Где: Краснодар

Репутация: 20
Всего: 25



Цитата(Hysteria @  14.5.2007,  18:18 Найти цитируемый пост)
, тут константами нельзя. 

А ты тут где тут константы нашла? Заполняешь элементы массива как хочешь. Как я понял (из твоего кода) на форме множество Edit`ов, в которых записаны нужные значения, не слишком удобно, если кодовых слов 50 (или еще больше). Можешь немного изменить мой код, например так:

Код

 AnsiString data[3] = { "name","years", "place" } ,
            newdata[3] = {"Вася", "12", "дома" };

 AnsiString temp = Memo1->Text;
 for (int i = 0; i<=2; i++)
  if (temp.Pos(data[i])!=0) {
   temp = temp.Insert(newdata[i],temp.Pos(data[i])-1);
   temp = temp.Delete(temp.Pos(data[i]-1),data[i].Length()+1);
  }
 Memo1->Text = temp;


В том случае, если всегда используются квадратные скобки. Вместо массива можешь также использовать ListBox или ValueListEditor, который создан для хранения параметра и ключа.


--------------------
Я человек - попробуйте обвинить меня за это.
PM MAIL   Вверх
Hysteria
Дата 14.5.2007, 18:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 19
Регистрация: 14.5.2007

Репутация: нет
Всего: нет



Я, может, и туплю конкретно, но не понимаю, что надо писать там, где в твоем коде AnsiString data и newdata.
PM MAIL   Вверх
Klin
Дата 14.5.2007, 18:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1938
Регистрация: 7.10.2002
Где: Краснодар

Репутация: 20
Всего: 25



Это массив, если вид заполнения сложный, то можно так:

Код

 AnsiString data[3];
 data[0] = "nama";
 data[1] = "age";
 data[2] = "place";

и т.п


--------------------
Я человек - попробуйте обвинить меня за это.
PM MAIL   Вверх
Hysteria
Дата 14.5.2007, 18:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 19
Регистрация: 14.5.2007

Репутация: нет
Всего: нет



Klin, понятно, что массив, а как я его заполню-то, если там все зависит от динамически возникающих Эдитов?и если я не знаю, будут ли там name и так далее?блин, наверное, это все бесполезно(
PM MAIL   Вверх
Klin
Дата 14.5.2007, 21:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1938
Регистрация: 7.10.2002
Где: Краснодар

Репутация: 20
Всего: 25



Используй ListBox или ValueListEditor - это два наиболее лучших варианта


--------------------
Я человек - попробуйте обвинить меня за это.
PM MAIL   Вверх
Hysteria
Дата 14.5.2007, 21:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 19
Регистрация: 14.5.2007

Репутация: нет
Всего: нет



Klin, у меня теперь вылезает другая ошибка : 
Project Project1.exe raised exception class EListError with message 'List index out of bounds(5)'.
Process stopped.  Use Step or Run to continue.

хотя и ничего не меняла-то...заново создаю - то же самое(
PM MAIL   Вверх
Klin
Дата 14.5.2007, 21:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1938
Регистрация: 7.10.2002
Где: Краснодар

Репутация: 20
Всего: 25



Просто отчет идет с 0 и заканчивается на 1 элемент раньше. Если в ставить в цикл, то можно использовать свойство Count.


--------------------
Я человек - попробуйте обвинить меня за это.
PM MAIL   Вверх
Hysteria
Дата 14.5.2007, 22:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 19
Регистрация: 14.5.2007

Репутация: нет
Всего: нет



Но я ведь раньше-то все работало
PM MAIL   Вверх
Hysteria
Дата 14.5.2007, 22:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 19
Регистрация: 14.5.2007

Репутация: нет
Всего: нет



Klin, а подскажи, пожалуйста, еще вот что.
Как правильно нужно включать одну форму в другую?
у меня в первой
#include "Unit1.h"
#include "Unit2.cpp"
а во второй
#include "Unit2.h"
, но тогда вторая форма требует первую

а если я ко второй форме прибавляю еще #include "Unit1.h", тогда возникает ошибка.
Как быть?
PM MAIL   Вверх
Anikmar
Дата 14.5.2007, 23:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 34
Всего: 59



Цитата(Hysteria @  14.5.2007,  22:49 Найти цитируемый пост)
а если я ко второй форме прибавляю еще #include "Unit1.h", тогда возникает ошибка.
Как быть? 

В заголовочном файле 2-й формы поставьте
class ИмяФормы1;
PM MAIL ICQ   Вверх
Страницы: (3) Все [1] 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




[ Время генерации скрипта: 0.0520 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.