sscanf转换为长整数

时间:2016-02-08 04:54:04

标签: c

任何人都可以解释以下行的输出:

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

1 个答案:

答案 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_strmonth_strday_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);