input - исходная строка содержащая разделеный пробелами значения
buffer - память используемая под значения в output
char** output - собственно результат (argv, argc вернется как возвращаемое значение ф-ции)
+ константы максимального размера буфера
ф-ция возвращаес количество слов в output
1 /**
2 * create int arc + char** arv from a sting
3 */
4 int prepare_prog_options(const char* input,
5 char* buffer,
6 int buffer_size,
7 const char** output,
8 int output_buff_size)
9 {
10 int buffer_pos = 0;
11 int argc = 0;
12 char* word_start = buffer;
13 if(NULL == input){
14 output[0] = NULL;
15 return 0;
16 }
17 --buffer_size;//we need one cell for last zero
18 --output_buff_size;
19 while(buffer_size > buffer_pos &&
20 output_buff_size > argc){
21 if(isspace(*input) || 0 == *input){
22 if(word_start != buffer + buffer_pos){
23 //current word have symbols
24 buffer[buffer_pos] = 0;
25 buffer_pos++;
26 output[argc] = word_start;
27 output[argc+1] = NULL;
28 ++argc;
29 word_start = buffer + buffer_pos;
30 }
31 if(0 == *input)
32 break;
33 ++input;
34 continue;
35 }
36 buffer[buffer_pos] = *input;
37 buffer[buffer_pos+1] = 0;
38 ++buffer_pos;
39 ++input;
40 }
41 return argc;
42 }
Пример использования:
char* str = " --test --hname mainHost --t 125";
char buffer[1024];
char* argv2[15];
int argc = prepare_prog_options(str, buffer, 1024,argv2,15);
зы: если кто надумет использовать - делать это вдумчиво, код писался ночью и еще не проверялся со всеми вариантами(и не будет, в моем случае строки очень простые)
ззы: проверил, поправил определение пробела, вообщем на всех моих кейсах оно работает нормально
7 комментариев:
Нафига нужны велосипеды, если на винде есть функция CommandLineToArgvW, а на посиксе shlex-split?
А по сути ваша функция огребёт проблемы на аргументах, взятых в кавычки.
виндовс в данном случае абсолютно не актуален. а где в посиксе есть shlex_split? это питоновска фича
да, это питоновская фича, но должна быть и библиотечная функция, иначе как бы это всё работало?
может и есть(но это что-то вполне может быть на питоне написано), но попробуй ее найти. Точней всередине что-то есть, но оно наружу не выведено. Писать такой год быстрей чем гуглить
Из-за игнорирования кавычек это полурешение - велосипед без колес. два бала.
как минимум надо такое описывать.
и кстати вот хороший пример того откуда берется говнокод - причина не в навыках или знаниях (будем полагать что с этим все ок), причина на самом деле чисто организационная - выкладывание не доделанного, не оттестированного кода в спешке. тут это просто блог, но в реальной работе люди делают то же самое.
о, хоть кто-то заметил :)
добавить обработку скобок просто, но ее тут нет, и не будет. логика проста - подобные предусматривания всех возможных вариантов нужны только при разработке библиотке, если переутяжелить код обычной програмы обработкой ситуации, которой в принципе быть не может, то как раз и получится упомянутый говнокод.
а описал/не описал - а зачем? код елементарный, сам себя документирует.
обновил код, добавил isspace
Отправить комментарий