Доброго день. Я только начинаю изучать С. Чтобы было продуктивнее, я беру себе куски задач которые когда-то реализовывал на других языках. Сегодня столкнулся со следующей проблемой.
Есть строка, разделенная запятыми, которую генерирует функция в 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'
Как это побороть?
Спасибо!