解析一个字符串

时间:2017-02-21 15:52:27

标签: c string

我正在实施一个接受g,a and x作为选项的程序。使用选项-g调用它接受员工和计算机的ID,然后应将ID存储在empl_id_arraycomp_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++;
    }
}

0 个答案:

没有答案
相关问题