Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: передача программе нескольких параметров, записанных через ","  (Прочитано 22124 раз)
0 Пользователей и 1 Гость смотрят эту тему.
CAHTA_
Постоялец

ru
Offline Offline
Пол: Мужской

« : 21-08-2006 18:01 » 

нужно мне реализовать следуюшее. вводится:(как пример)

myprog E0 E1,F5 F4, A3 A7 , C4 C1 ,B1 B9   

элементы должны пометиться в два мессива.

arr1 = E0 F5 A3 C4 B1
arr2 = E1 F4 A7 C1 B9

подскажите алгоритм. код мне не нужен...
это типа передача программе нескольких параметров, записанных через ",".
Записан
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #1 : 21-08-2006 18:26 » 

CAHTA_, Насколько я знаю, разделитель между аргументами является только пробел. Но в принципе если брать аргумент в кавычки, то он будет восприниматься как один аргумент.
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
CAHTA_
Постоялец

ru
Offline Offline
Пол: Мужской

« Ответ #2 : 21-08-2006 18:28 » 

этото понятно.. но мне нада именно чтобы они передовались вот так. вот только не знаю как лучьше их обрабатывать в проге
Записан
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #3 : 21-08-2006 18:41 » 

Я не совсем понял в чем именно проблема? Там же все элементарно. argv - количество аргументов. argc - сами аргументы в строчном представлении.
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
CAHTA_
Постоялец

ru
Offline Offline
Пол: Мужской

« Ответ #4 : 21-08-2006 18:48 » 

угу, но вот как именно сделать чтобы аргументы копировались в нужные массивы


myprog E0 E1,F5 F4, A3 A7 , C4 C1 ,B1 B9   

элементы должны пометиться в два мессива.

arr1 = E0 F5 A3 C4 B1
arr2 = E1 F4 A7 C1 B9
первые эл-ты каждой пары записываются в arr1 , а вторые - в arr2
Записан
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #5 : 21-08-2006 19:18 » 

Можно так
Код:
MyDate MyPreob(char *ch)
{
     // Здесь преобразуем строковое значение в MyDate
    // По ходу пьесы убиваем запятую
}

int main((int argc, char **argv)
{
    MyDate Mass1[100];
    MyDate Mass2[100];
    int beg1=0;               // Бегунок по первому массиву
    int beg2=0;               // Бегунок по второму массиву
    int i=1;                      // Пропускаем нулевой аргумент
    int uks=0;
    while (i<argc)
   {
       if (uks) Mass2[beg2++]=MyPreob(argv[i++]);
       else Mass1[beg1++]=MyPreob(argv[i++]);
       uks=1-uks;
   }
   // Делаем свои дела
   return 0;
}
« Последнее редактирование: 21-08-2006 19:21 от Finch » Записан

Не будите спашяго дракона.
             Джаффар (Коша)
CAHTA_
Постоялец

ru
Offline Offline
Пол: Мужской

« Ответ #6 : 21-08-2006 19:40 » 

хм... это не тто что мне нужно...
Записан
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #7 : 21-08-2006 19:49 » 

По любому тебе нужно будет парсить. Я применял в таких случаях чуть облегченный конечный автомат. И парсил с помошью его.
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
CAHTA_
Постоялец

ru
Offline Offline
Пол: Мужской

« Ответ #8 : 21-08-2006 19:52 » 

вот этим я шас и занимаюсь Жаль прога на 2\3 основана на парсинге Жаль гемор блин, но интересна... прога для редактирования конфига под freebsd
Записан
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #9 : 21-08-2006 20:09 » 

Сходи сюда http://www.softcraft.ru/auto.shtml

Вот мой код в данном направлении:
Код:
#define SyError      0                 //  Ошибочный символ
#define SySymbol     1                 // обшие символы
#define SyDigit      2                 // Число
#define SyLatin      3                 //  Латинские буквы
#define SyCommas     4                 //  Двоеточие
#define SyApost      5                 //  Апостроф
#define SyEquals     6                 // Знак  равно
#define SySpace      7                 // Пробел
#define SyQuoteBeg   8                 // <
#define SyQuoteEnd   9                 // >
#define SyAmp        10                // Амперсенд 
#define SySlQuest    11                //  Вопросительный знак
#define SySlExcl     12                //  Восклицательный знак
#define SySlesh      13                // Слэш
#define MaxSy     SySlesh+1

const static char tab[256]=
{
// 0  1  2  3  4  5  6  7  8  9  A  B  C  D  E  F 
   0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 0, 0, 7, 0, 0,    //0
   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,    //1
   7,12, 4, 1, 1, 1,10, 5, 1, 1, 1, 1, 1, 2, 1,13,    //2
   2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 8, 6, 9,11,    //3
   1, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,    //4
   3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 1, 1, 1, 1, 3,    //5
   1, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,    //6
   3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 1, 1, 1, 1, 1,    //7
   1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,    //8
   1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,    //9
   1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,    //A
   1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,    //B
   1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,    //C
   1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,    //D
   1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,    //E
   1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1     //F
};

int EndTeg(void)
{
   int res=0;
#define EEnd      0
#define EB1       1                    //
#define EB2       2                    //
#define EB3       3                    //
#define EB4       4                    //
#define EB5       5
#define EErr      6
#define MaxE      EErr+1

const static int ETab[MaxE][MaxSy]=
{
// Er   Sy    Dig   Lat   "     '     =    Spac   <     >     &     ?     !     /
{EEnd, EEnd, EEnd, EEnd, EEnd, EEnd, EEnd, EEnd, EEnd, EEnd, EEnd, EEnd, EEnd, EEnd},  //EEnd
{EErr, EErr, EErr, EErr, EErr, EErr, EErr, EErr, EErr, EErr, EErr, EErr, EErr, EB2 },  //EB1
{EErr, EErr, EErr, EB3 , EErr, EErr, EErr, EB2 , EErr, EErr, EErr, EErr, EErr, EErr},  //EB2
{EErr, EErr, EB3 , EB3 , EErr, EErr, EErr, EB4 , EErr, EB4 , EErr, EErr, EErr, EErr},  //EB3
{EErr, EErr, EErr, EErr, EErr, EErr, EErr, EB5 , EErr, EEnd, EErr, EErr, EErr, EErr},  //EB4
{EErr, EErr, EErr, EErr, EErr, EErr, EErr, EB5 , EErr, EEnd, EErr, EErr, EErr, EErr},  //EB5
{EEnd, EEnd, EEnd, EEnd, EEnd, EEnd, EEnd, EEnd, EEnd, EEnd, EEnd, EEnd, EEnd, EEnd}   //AErr
};
int Ev=EB1;
char Name[vXML_MaxTeg+1];
int LName=0;
Name[LName]=0;
XML_IDENT Sim;
while (Ev != EEnd)
{
Ev=ETab[Ev][tab[buf[beg]]];
switch(Ev)
{
case EB1:
case EB2:
case EB5:
if (!IncBeg()) Ev=EErr;
break;
case EB3:
Name[LName++]=buf[beg];
Name[LName]=0;
if (LName>=vXML_MaxTeg) Ev=EErr;
if (!IncBeg()) Ev=EErr;
break;
case EB4:
CaseUp(Name);
Trees.SetNullPos();
    if (Trees.FindWord(Name,&Sim)==2) res=Sim.id;
break;
case EErr:
res=0;
break;
}
}
return res;
}

Выдрал из проекта, поэтому могут быть некоторые непонятные команды Улыбаюсь
« Последнее редактирование: 17-12-2007 17:23 от Алексей1153++ » Записан

Не будите спашяго дракона.
             Джаффар (Коша)
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #10 : 22-08-2006 03:38 » 

Цитата: Finch
Выдрал из проекта, поэтому могут быть некоторые непонятные команды
Или человек знает, как программируется автомат, или не знает. Если не знает, то ему потребуется введение в теорию.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #11 : 22-08-2006 05:27 » 

CAHTA_, почему ты не хочешь просто равпарсить числа да и всё?
в чем проблема выдрать запятые пробулы и прочее?
вот первое что пришло в голову
склеиваем все парметры а потом парсим как одну строчку
Код:
int _tmain(int argc, _TCHAR* argv[])
{
if (argc<2)
return 0;

stringstream sstr;
// клеиваем параметры и с запятыми и без
for (int i=1;argc!=i;++i)
{
sstr << argv[i] << " ";
}

vector<string> v1,v2;

size_t p = 0, bpos = 0;
bool firstVector = true;
while (bpos < sstr.str().size())
{
p = sstr.str().find_first_of("\t ,",bpos);
if ((p != bpos) || p == string::npos)
if (firstVector)
{
v1.push_back(sstr.str().substr(bpos,p-bpos));
firstVector = false;
}
else
{
v2.push_back(sstr.str().substr(bpos,p-bpos));
firstVector = true;
}
bpos = p+1;
}


cout << "V1 = ";
for (vector<string>::iterator it = v1.begin(),it_end = v1.end();it != it_end;++it)
cout << *it << " ";
cout << "\n";

cout << "V2 = ";
for (vector<string>::iterator it = v2.begin(),it_end = v2.end();it != it_end;++it)
cout << *it << " ";
cout << "\n";
return 0;
}

на входе test E0 E1,F5 F4, A3 A7 , C4 C1 ,B1 B9
на выходе

V1 = E0 F5 A3 C4 B1
V2 = E1 F4 A7 C1 B9
Записан

Странно всё это....
CAHTA_
Постоялец

ru
Offline Offline
Пол: Мужской

« Ответ #12 : 22-08-2006 11:09 » 

LogRus, спасибо. я по этому пути и пошел. вот только я пишу на С
Записан
Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #13 : 22-08-2006 11:21 » 

CAHTA_, одна фигня Улыбаюсь
возьми компилер корорый C++ в С перегоняет Улыбаюсь
Записан

Странно всё это....
CAHTA_
Постоялец

ru
Offline Offline
Пол: Мужской

« Ответ #14 : 22-08-2006 11:56 » 

увы у меня таких вешей нет
Записан
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #15 : 22-08-2006 12:50 » 

Цитата
Или человек знает, как программируется автомат, или не знает. Если не знает, то ему потребуется введение в теорию.
dimka, для этого я и дал ссылку на софт крафт. Мне лично чтобы понять сушность хватило почитать статьи представленные там.
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #16 : 22-08-2006 13:29 » 

CAHTA_, те ты хочешь сказать, что на С нельзя парсер написать? Ага
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
CAHTA_
Постоялец

ru
Offline Offline
Пол: Мужской

« Ответ #17 : 22-08-2006 13:50 » 

где это я сказал такое? я шас этим и занимаюсь на С =)
Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #18 : 22-08-2006 14:09 » 

Эт я к тому, что ты же сам просил алгоритм, а не код. LogRus тебе его и выдал. Про компайлер это прикол был. Ага
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
CAHTA_
Постоялец

ru
Offline Offline
Пол: Мужской

« Ответ #19 : 22-08-2006 19:53 » 

Спасибо всем кто помогал. вот то что я намутил:) не очень элегантно, но работает.

Код:
char  newop[255][255]={0},
      oldop[255][255]={0},
      STR[256]={0};

// склеивание аргументов argv[] через пробел. пробел не ставится до и после ","
      strcpy(STR,argv[2]);
      for(D=3;D<argc;D++)
      {
         DD=D;
         if(((*(argv+D))[0])!='\x2c' && (*(argv+DD-1))[(int)strlen(argv[DD-1])-1]!='\x2c')
            strcat(STR, " ");
         strncat(STR, argv[D],strlen(argv[D]));
      }

      ii=0;
      i=0; DD=0;Di=0;

      while(i<strlen(STR))
      {
         D=0;
         while(STR[i]!='\x20' && STR[i]!='\x2c')
            oldop[ii][D++]=STR[i++];
         D=0;i++;
         while(STR[i]!='\x2c' && STR[i]!='\0')
            newop[ii][D++]=STR[i++];
         ii++;i++;
      }

входная строка:
strcopy.exe change 192.168.1.1 192.168.1.10, AA:BB:CC:DD:EE:FF 00:00:00:00:00
результат то что нада =)
« Последнее редактирование: 17-12-2007 17:26 от Алексей1153++ » Записан
Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #20 : 23-08-2006 06:32 » 

Джон, разве нет таких компайлеров?
кажется Comeau не так работает?
или меня клинит Улыбаюсь

CAHTA_, оппа да ты гуру C Улыбаюсь
кстати вместо STR[i++] я бы использовал STR++
а в место проверки
while(i<strlen(STR))
использовал char * pEnd = STR+strlen(STR);
while(STR != pEnd)
и вот тут
while(STR[i ]!='\x2c' && STR[i ]!='\0')
заменим на while(*STR !='\x2c' && STR != pEnd)
решение в стиле STL Улыбаюсь
« Последнее редактирование: 17-12-2007 17:26 от Алексей1153++ » Записан

Странно всё это....
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #21 : 23-08-2006 08:16 » new

Джон, разве нет таких компайлеров?
кажется Comeau не так работает?
или меня клинит Улыбаюсь

Если ты имеешь ввиду то, что он может компилировать С++ и С код, так это наверное каждый может, хотя я конечно всех компиляторов не знаю, но например студийный может. Ты же написал про "перегонку" из С++ в С. Хотел бы я посмотреть как выглядит результат какого-нить С++ ООП проектика со всеми наворотами (плиморфизм, множественное наследование и тд) в С. Улыбаюсь)

зы А главное - ЗАЧЕМ?
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines