Парсинг строки C

120
14 февраля 2018, 11:39

Привет всем. Есть необходимость парсить строку следующего вида: -f 1000 -d 10 -f 90 Необходимо такую строку спарсить (независимо от расположения аргументов), проверить значения параметров на корректность (например, это должны быть натуральные числа), и присвоить определенным переменным в коде. Будет что-то вроде запуска с аргументами. Естественно, параметры могут быть записаны в случайном порядке, могут быть пропущены (тогда будет установлено значение по умолчанию). Понимаю, что нужно смотреть в сторону sscanf и регулярных выражений, но может быть у кого-нибудь уже есть готовый код. Строка записана в буффер. Спасибо.

Answer 1

если данная строка передается через аргументы командной строки, то все уже давно придумано. Для этого есть функции getopt(), getopt_long(); https://www.ibm.com/developerworks/ru/library/au-unix-getopt/

Answer 2

В gcc (и в mingw тоже) для этих целей есть вполне стандартные функции: getopt(), getopt_long(), getopt_long_only(). Почитать про них можно хотя бы здесь. Для случая Visual Studio, наверное, можно взять этот вариант. Правда, последнего мне нашел гугль, а сам я не пробовал его использовать (я предпочитаю gcc).

Answer 3

Как-то давно я написал разборщик командной строки. И с тех пор им пользуюсь. Вот код:

Заголовочный файл comline.h :

#ifndef COMLINE_THIS
#define COMLINE_THIS
#include <sstream>
using namespace std;
const char comline_switch1='-';
const char comline_switch2='/';
bool comline_getswstring(int argc,char *argv[],char sw,char** s);
bool comline_getnswstring(int argc, char *argv[],int num,char** s);
template <class T>
bool comline_getswvalue(int argc,char *argv[],char sw,T* val){
char *s;
bool ret=comline_getswstring(argc,argv,sw,&s);
if(ret!=false){
stringstream st(s);
if(val!=NULL) st>>(*val);
}
return ret;
};
#endif

Файл кода comline.cpp:

#include <comline.h>
bool comline_getswstring(int argc, char *argv[],char sw,char** s){
int i;
   for(i=1;i!=argc;i++){
      if(((argv[i][0]==comline_switch1)||(argv[i][0]==comline_switch2))&&(argv[i][1]==sw)){
         if(s!=NULL) *s=argv[i]+2;
         return true;
      }//if
   }//for
return false;
}
bool comline_getnswstring(int argc, char *argv[],int num,char** s){
int n=0;
int i;
for(i=1;i!=argc;i++){
   if((argv[i][0]!=comline_switch1)&&(argv[i][0]!=comline_switch2)&&(argv[i][0]!=0)){
      if(n==num){
         if(s!=NULL) *s=argv[i];
         return true;
      }//if
      n++;
   }//if
}//for
return false;
}
READ ALSO
Spring Security и группы ролей

Spring Security и группы ролей

Здравствуйте, за ранее извиняюсь за, возможно, нубский вопрос, но всё жеРазбираюсь с spring security, для своего приложения выполнил классическую...

194
Привести к типу Integer [требует правки]

Привести к типу Integer [требует правки]

как можно привести к типу integer

140
Железобетонный random java

Железобетонный random java

Пишу небольшую игру, в ней генерируется случайное число, от этого числа зависит весь исход уровня, те надо его максимально рандомизировать,...

164