我正在实施一个接受g,a and x
作为选项的程序。使用选项-g
调用它接受员工和计算机的ID,然后应将ID存储在empl_id_array
和comp_id_array
使用示例:
./my_test -g e-1-2-3-c-0-1
./my_test -g e-1-2-c-0
第一个例子的预期结果是:
empl_id_array[] = {1,2,3} //e-1-2-3
comp_id_array[] = {0,1} // c-0-1
您可以看到的问题是,在第一个示例中,在第二个2个ID中传递了3个员工ID,因此我认为我无法使用scanf
系列来解析optarg
(格式是可变的。)
我所做的是一个函数get_resource
来进行解析,但缺少大量的检查。所以我问是否有一个更好地处理这种情况的函数,我应该手动执行吗?
我看看strtok
和正则表达式,但它们似乎无法解决问题,如果我错了,请纠正我。
#include <stdio.h>
#include <string.h>
#include <unistd.h>
int empl_id_array[10];
int empl_id_array_count = 0;
int comp_id_array[10];
int comp_id_array_count = 0;
void get_resource(char *resource_str);
int main(int ac, char *av[])
{
int opt;
char *pattern = "g:a:x:";
char str[20];
while ((opt = getopt(ac, av, pattern)) != -1) {
switch (opt) {
case 'g':
strcpy(str, optarg);
get_resource(str);
break;
default:
break;
}
}
}
void get_resource(char *resource_str) {
int i = 0;
int exit = 0;
int state = -1; /* (-1): initial state
(0): means we are actually reading an employee ID
(1): Actually getting computer ID
(2): End of the parsing */
char car;
while (!exit) {
car = resource_str[i];
if (car == '\0')
state = 2; /* parsing finished */
switch (state) {
case -1:
if (car == 'e')
state = 0;
if (car == 'c')
state = 1;
break;
case 0:
if (('0' <= car) && (car <= '9')) {
empl_id_array[empl_id_array_count] = car - '0';
empl_id_array_count++;
}
break;
case 1:
if (('0' <= car) && (car <= '9')) {
comp_id_array[comp_id_array_count] = car - '0';
comp_id_array_count++;
}
break;
case 2:
exit = 1;
break;
default:
break;
}
i++;
}
}