任何人都可以解释以下行的输出:
sprintf(tempStr,"%s%2s%s",year_str,month_str,day_str);
count=sscanf(tempStr,"%ld%s",&tempout,other);
它使用日,月和年值创建数字日期。
但是,它如何将数值转换为长整数?
例如:你能否告诉我,年,月和日是 2016
, 02
和 08
,那么 tempout
中的输出值是多少?
这里是输入的方式:
char date_str[20];
char day_str[2];
char month_str[2];
char year_str[2];
time_t now;
struct tm* current_time;
/* get current time */
now = time(0);
/* convert time to 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);
运行它时的输出(使用http://cpp.sh/),我得到的是:
1160208
虽然我认为它应该是:
20160208 即可。
在其他情况下,如果年份 116
,则下面有一行 2016
:
sprintf(year_str,"%02d",options.year - 1900);
此处, date_str
是上面提到的tempStr
,因此输入为: 1160208
答案 0 :(得分:5)
格式说明符%ld
用于隐式将数值强制转换为long int
,而%d
仅用于int
。
修改强>
我现在运行你的代码,使用其中提到的变量的以下数据类型:
#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);
}
然后我才明白你的顾虑是什么,输出显示:
tempStr:20160208
tempout:20160208
显然,我们可以看到此问题出现在sprintf
而非sscanf
。
您向%s%2s%s
提供的格式说明符sprintf
表示您希望连接三个字符串year_str
,month_str
和day_str
即没有任何字符(&#39; /&#39; ,空间或&#39; - &#39; )介于他们之间。 2
中的%2s
仅表示仅在可能的位置填充两个空格。
这意味着当sscanf
尝试将long int
读入tempout
时,它会将20160208
读为一个正确执行其操作的数字。
因此,您必须在年,月和之间添加space
-
或/
等字符一天,一切都会正常工作:
sprintf(tempStr,"%s %2s %s", year_str,month_str,day_str);
现在的新输出是:
tempStr:2016 02 08
tempout:2016
<强> EDIT2:强>
如果查看Man Page of localtime(),您会看到struct tm
成员的范围是:
tm_mday
该月的某一天,在1到31的范围内。
tm_mon
自1月以来的月数,范围为0至11。
tm_year
自1900年以来的年数。
这解释了在1
中添加sprintf(month_str,"%02d",current_time->tm_mon + 1);
的问题,所以1900
应添加到current_time->tm_year
以获得正确的输出:
sprintf(year_str,"%d",current_time->tm_year+1900);