Использование strtok_r () для извлечения нескольких строк из массива - PullRequest
0 голосов
/ 26 мая 2018

Я пытаюсь проанализировать и одновременно сохранить некоторые данные, используя strtok_r () из массива char, который передается в мою функцию.Извлечение первой переменной работает, как и ожидалось, когда я получаю вторую, я получаю только частичную часть, которая происходит между токеном и NULL-терминатором строки.Здесь я пытаюсь получить значение после 'to =', пароль после 'paw =' и число после 'tz ='.Первая и последняя работа, но я теряю токены по обе стороны от «лапы» и, похоже, не могу извлечь текст по другую сторону от «=».Меня каждый раз оставляют с NULL.

Это лучший способ проанализировать строку, подобную этой?У меня есть рабочая версия, использующая strtok (), но она использует так много переменных, потому что мне приходится каждый раз сохранять временную переменную, а затем запускать токены для каждой из них - это требует двух отдельных случаев, и я бы предпочел, чтобы все обрабатывалось внутриодин случай.Я также пытался использовать strchr (), но это также было очень громоздко и требовало много временных переменных.

Спасибо за любой совет, и я с нетерпением жду обсуждения!

Вот мой код ниже,компилируется (требуется string.h)

 int main(int argc, char **argv){    
   char resp[] = "INCOMING,1,443:GET /send?to=12&paw=password&tz=3 HTTP/1.1";

   char *arg;
   char *p_arg;
   char *temp;
   char *p_temp;

   printf("resp is: %s\n",resp); //full response
   arg = strtok_r(resp, ",", &p_arg);
   arg = strtok_r(NULL, ",", &p_arg);
   printf("first num = %s\n", arg); //get the first number
   strtok_r(NULL,"/", &p_arg); //discard the rest up until '/'
   arg = strtok_r(NULL,"?", &p_arg);
   printf("arg is now: %s\n", arg); //we got the first operator "test"

   if(strncmp(arg, "send", 4) == 0){
     while(arg){
       if(strncmp(arg,"to",2) == 0){
          printf("in to, arg is %s\n", arg);
          temp = strtok_r(arg,"to", &p_temp);
          temp = strtok_r(temp,"=", &p_temp); //get the number after 'to='
          printf("to is %s\n", temp);
       } else if(strncmp(arg,"paw",3) == 0){
          printf("In paw, arg is %s\n",arg); //got the paw token
          //now get the password after the '='
          temp = strtok_r(arg,"paw", &p_temp);
          temp = strtok_r(temp,"=", &p_temp);
          printf("paw is %s\n", temp);
       } else if(strncmp(arg,"tz",2) == 0){
          printf("In tz, arg is %s\n",arg); //got the tz token
          temp = strtok_r(arg,"tz=", &p_temp);
          temp = strtok_r(temp," ", &p_temp); //extract tz value
          printf("tz is %s\n", temp);
       }
       arg = strtok_r(NULL,"&", &p_arg);
     } //while
   } //if "test"
 } //main
...