C 将4位数年份转换为2位数年份

C 将4位数年份转换为2位数年份,c,C,我想得到一年的最后两位数。例如,如果我以一个输入值“2012”开始,我希望生成一个输出值“12” 在fprintf中是否有只打印最后两位数字的选项?只需打印模数为100的数字: printf("%2d\n", 2012 % 100); 将打印12只需打印以100为单位的数字: printf("%2d\n", 2012 % 100); 将打印12Steve314想法(现已删除)很好,但未正确呈现。示例:如果年份是2009年,则使用“%2d”获取“09”是不正确的。“%2d”将得到“9”。“%0

我想得到一年的最后两位数。例如,如果我以一个输入值“2012”开始,我希望生成一个输出值“12”


fprintf
中是否有只打印最后两位数字的选项?

只需打印模数为100的数字:

printf("%2d\n", 2012 % 100);

将打印
12

只需打印以100为单位的数字:

printf("%2d\n", 2012 % 100);
将打印
12

Steve314想法(现已删除)很好,但未正确呈现。示例:如果年份是2009年,则使用“%2d”获取“09”是不正确的。“%2d”将得到“9”。“%02d”将为您提供“09”

此外,还存在负数问题d、 (-99)的%2d、%02d都将产生一个3个字符的答案。如果已知年份未签名,建议使用“u”而不是“d”。如果签署的年份可能是负数,您可能需要为这种深奥的情况编写额外的代码。

Steve314 idea(现已删除)很好,但没有正确呈现。示例:如果年份是2009年,则使用“%2d”获取“09”是不正确的。“%2d”将得到“9”。“%02d”将为您提供“09”


此外,还存在负数问题d、 (-99)的%2d、%02d都将产生一个3个字符的答案。如果已知年份未签名,建议使用“u”而不是“d”。如果签名年份可能是负数,您可能需要额外的代码来处理这种深奥的情况。

或者,在Fortran中,为了反驳OP的说法,即在Fortran中,我们不能以所需格式写入数字
write(*,'(i2.2)')mod(2012100)
,或者,在Fortran中,为了证明OP的声明,在FORTRAN中,我们不能以期望的格式写代码:代码>写(*,‘(i2.2))mod(2012100)< /代码>好捕获-我已经使用C++太久了。在有符号整数的
%
上,这是一个令人讨厌的问题。在数学中,余数可以是负数(取决于除法的取整方式),但模不能。我们有一个操作员,它不决定它在做什么工作——一个平台可能总是给出非负面结果,也可能不会。Ada有两个操作符-
mod
rem
,虽然我一直记得它,但它不是唯一一个这样做的操作符。
%2d
将为您提供
2012
,而不是
9
。该数字是一个最小字段宽度,而不是一个限制。@Matt McNabb删除的Steve314注释建议类似于
printf(“%2d\n”,年份%100)。我的回答是,如果
year
刚好超过了
printf中100的倍数(“%2d\n”,2009%100),则处理该案例将打印“9”。通过在格式中添加
“0”
,code可以确保在OP请求中获得两位数,而不是最高级别的答案。为了更清晰,更新了答案。代码2中的“%2D”<代码>是一个最小字段宽度,但不是最小位数。好的catch -我已经使用C++太久了。在有符号整数的
%
上,这是一个令人讨厌的问题。在数学中,余数可以是负数(取决于除法的取整方式),但模不能。我们有一个操作员,它不决定它在做什么工作——一个平台可能总是给出非负面结果,也可能不会。Ada有两个操作符-
mod
rem
,虽然我一直记得它,但它不是唯一一个这样做的操作符。
%2d
将为您提供
2012
,而不是
9
。该数字是一个最小字段宽度,而不是一个限制。@Matt McNabb删除的Steve314注释建议类似于
printf(“%2d\n”,年份%100)。我的回答是,如果
year
刚好超过了
printf中100的倍数(“%2d\n”,2009%100),则处理该案例将打印“9”。通过在格式中添加
“0”
,code可以确保在OP请求中获得两位数,而不是最高级别的答案。为了更清晰,更新了答案。
“%2d”
中的2是最小字段宽度,但不是最小位数。