Как разрезать сроку в «С»?

Доброго день. Я только начинаю изучать С. Чтобы было продуктивнее, я беру себе куски задач которые когда-то реализовывал на других языках. Сегодня столкнулся со следующей проблемой.
Есть строка, разделенная запятыми, которую генерирует функция в MySQL и выдает на клиента:
"2,31f427f28e2515fe4f557965ca4a04ddf1320da68c2cd8f5d333151bc75ad340,E15A6E9B,E2334E7B,E2786846"
Следующий код вполне справился с задачей:
#include <string.h>
#include <stdio.h>

#define MAX_USER_CARD 10

typedef struct access_param {
  int auth_type, card_count;
  char *card_id[MAX_USER_CARD], *password_hash;
} access_param_t;

access_param_t getAccessParam(char *str_param){
  access_param_t result;
  int i = 0;
  char *token = strtok( str_param, "," );
  result.card_count = 0;

  while( token != NULL ){

    if(i == 0){
      result.auth_type = atoi(token);
    }

    if(i == 1){
      result.password_hash = token;
    }

    if(i > 1 && (i - 2)<MAX_USER_CARD){
      result.card_count++;
      result.card_id[i-2] = token;
    }

    //fprintf(stderr, "TOKEN %s\n", token );

    token = strtok(NULL, ",");

    i++;
  }

  return result;
}

int main(){
  int i;
  char str_param[] = "2,,E15A6E9B,E2334E7B,E2786846";
  //char str_param[] = "2,31f427f28e2515fe4f557965ca4a04ddf1320da68c2cd8f5d333151bc75ad340,E15A6E9B,E2334E7B,E2786846";

  access_param_t ap = getAccessParam(str_param);

  fprintf(stdout, "AuthType='%d', Password='%s', CardCount='%d'", ap.auth_type, ap.password_hash, ap.card_count);

  for(i = 0; i<ap.card_count; i++){
    fprintf(stdout, " Card[%d]='%s'", i, ap.card_id[i]);
  }

  fprintf(stdout, "\n");


  return 0;
}


Результат: AuthType='2', Password='31f427f28e2515fe4f557965ca4a04ddf1320da68c2cd8f5d333151bc75ad340', CardCount='3' Card[0]='E15A6E9B' Card[1]='E2334E7B' Card[2]='E2786846'

Но если, вдруг, в строке не оказывается хеша пароля "2,,E15A6E9B,E2334E7B,E2786846" то все ломается и в качестве пароля записывается ID первой карты.
AuthType='2', Password='E15A6E9B', CardCount='2' Card[0]='E2334E7B' Card[1]='E2786846'
Как это побороть?
Спасибо!
  • Вопрос задан
  • 264 просмотра
Решения вопроса 1
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
man strtok говорит
A sequence of two or more contiguous delimiter bytes in the parsed string is considered to be a single delimiter. Delimiter bytes at the start or end of the string are ignored. Put another way: the tokens
returned by strtok() are always nonempty strings.

А это значит, что для вашего варианта использования функция не подходит.
Разбирайте руками с использованием strchr/strspn.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@vilgeforce
Раздолбай и программист
Первое что приходит в голову - конечный автомат сделать.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы