2014-02-10 3 views
0

Я создаю функцию, которая берет запись людей (хранится в *individual в параметрах функции), отделяет запись, чтобы получить день рождения людей, а затем функция вычисляет их возраст. Проблема, с которой я сталкиваюсь, - это когда я использую strrchr для поиска записи для дня рождения, она меняет исходное значение, когда я этого не хочу. Итак, вместо хранения Steven, Cortright, 3/1/1940 он должен хранить Steven, Cortright, 3Значение возвращает неверное значение

Я пробовал все, что я могу придумать, чтобы исправить это. Ниже мой код, я признателен за любую помощь/совет:

char* calcage(char *individual) 
    { 

    time_t current_time; 
    char *c_time_string; 
    char *birthday; 
    char *bmonth, *bday, *byear; 
    int numbmonth, numbday, numbyear; 
    struct tm str_bday; 
    time_t time_bday; 
    double diff; 
    double years; 

    double monthscalc; 
    int monthsage; 
    int yearsage; 


    current_time = time(NULL); 


    c_time_string = ctime(&current_time); 
    birthday = strrchr(individual, ','); 
    birthday++; 


    bmonth = strtok(birthday, "/"); 
    bday = strtok(NULL, "/"); 
    byear = strtok(NULL, "/"); 

    numbmonth = atoi(bmonth); 
    numbday = atoi(bday); 
    numbyear = atoi(byear); 

    str_bday.tm_year = numbyear - 1900; 
    str_bday.tm_mon = numbmonth - 1; 
    str_bday.tm_mday = numbday; 
    str_bday.tm_hour = 0; 
    str_bday.tm_min = 0; 
    str_bday.tm_sec = 1; 
    time_bday = mktime(&str_bday); 

    diff = difftime(current_time, time_bday); 
    years = diff/60/60/24/365.242; 

    yearsage = (int) years; 


    int inpart = (int) years; 
    double months = years - inpart; 
    monthscalc = (365.242 * months)/30.4368; 

    monthsage = (int) monthscalc; 

    char *calculatedAge = (char *)malloc(50*sizeof(char)); 
    snprintf(calculatedAge,100, "You are %d years and %d months old.", yearsage, \ 
    monthsage); 

    return calculatedAge; 
    } 
+1

Это связано с strtok, который изменяет свой аргумент, как описано в docs – user3159253

ответ

2

Проблема заключается в strtok, не strrchr. strtok ставит нулевой байт после токена в исходном буфере.

1

Вместо strtok использования sscanf для разбора строки:

int month = 0, day = 0, year = 0; 
sscanf(birthday, "%d/%d/%d", &month, &day, &year); 

таким образом вы не испортите аргумент

0
char* calcage(char *individual){ 
    time_t now = time(NULL); 
    struct tm *local = localtime(&now); 

    char *temp = strdup(strrchr(individual, ',')+1);//make copy 
    char *birthday = temp; 
    int bmonth, bday, byear; 
    bmonth = atoi(strtok(temp, "/")); 
    bday = atoi(strtok(NULL, "/")); 
    byear = atoi(strtok(NULL, "/")); 
    int age = local->tm_year + 1900 - byear -1; 
    int lm = local->tm_mon + 1; 
    if(bmonth <= lm && bday <= local->tm_mday) 
     ++age; 
    int mtemp = lm - bmonth; 
    if(mtemp < 0 || mtemp == 0 && bday > local->tm_mday) 
     mtemp += 12; 
    int mage = age * 12 + mtemp; 
    char *calculatedAge = realloc(temp, 50); 
    snprintf(calculatedAge, 50, "You are %d years and %d months old.", age, mage); 
    return calculatedAge; 
} 
+0

большое вам спасибо. Когда я попытался скопировать его, прежде чем я разместил здесь, я попытался использовать strcpy, не знал о strdup. спасибо за помощь – Stc5097

Смежные вопросы