c - sscanf to convert to a long integer -
can explain output of lines below:
sprintf(tempstr,"%s%2s%s",year_str,month_str,day_str); count=sscanf(tempstr,"%ld%s",&tempout,other); it creates numeric date, using day, month , year values.
but, how convert numeric value long integer?
for e.g.: can tell me, if year, month , day 2016, 02, , 08, output value in tempout.
here, how input taken:
char date_str[20]; char day_str[2]; char month_str[2]; char year_str[2]; time_t now; struct tm* current_time; /* current time */ = time(0); /* convert time tm structure */ current_time = localtime(&now); /* format day string */ sprintf(day_str,"%02d",current_time->tm_mday); /* format month string */ sprintf(month_str,"%02d",current_time->tm_mon + 1); /* format year string */ sprintf(year_str,"%d",current_time->tm_year); /* assemble date string */ sprintf(date_str,"%s%2s%s",year_str,month_str,day_str); the output of when run (using http://cpp.sh/), is:
1160208
whereas thought should be:
20160208.
in other context, there line below, 116 if year 2016:
sprintf(year_str,"%02d",options.year - 1900);
here, date_str tempstr mentioned above, hence, input is: 1160208
the format specifier %ld implicitly typecasting numeric value long int, whereas, %d int alone.
edit:
i ran code now, using following data types of variables mentioned therein:
#include<stdio.h> #include<string.h> int main() { char tempstr[100]; char year_str[5]; char month_str[3]; char day_str[3]; long int tempout; char other[100]; int count; strcpy(year_str, "2016"); strcpy(month_str ,"02"); strcpy(day_str ,"08"); sprintf(tempstr,"%s%2s%s",year_str,month_str,day_str); count=sscanf(tempstr,"%ld%s",&tempout,other); printf("tempstr: %s\ntempout: %ld\n", tempstr,tempout); } then did understand concern is, output showing:
tempstr: 20160208
tempout: 20160208
clearly, can see problem here in sprintf , not in sscanf.
the format specifier %s%2s%s have given sprintf means want concatenate 3 strings, year_str, month_str , day_str namely, without character ('/', space or '-') in between them. 2 in %2s means padding of 2 spaces possible.
this means when sscanf try read long int tempout read 20160208 1 number doing rightly meant do.
you therefore have add character such space - or / between year, month , day , work fine:
sprintf(tempstr,"%s %2s %s", year_str,month_str,day_str); new output is:
tempstr: 2016 02 08
tempout: 2016
edit2:
if @ man page of localtime() see ranges of members of struct tm are:
tm_mday
the day of month, in range 1 31.
tm_mon
the number of months since january, in range 0 11.
tm_year
the number of years since 1900.
which explains addition of 1 in sprintf(month_str,"%02d",current_time->tm_mon + 1); similarly, 1900 should added current_time->tm_year correct output:
sprintf(year_str,"%d",current_time->tm_year+1900);
Comments
Post a Comment