这是将12小时时间格式转换为24小时格式的代码。
#include<iostream>
#include<cstdio>
using namespace std;
int main() {
string s;
cin >> s;
int n = s.length();
int hh, mm, ss;
hh = (s[0] - '0') * 10 + (s[1] - '0');
mm = (s[3] - '0') * 10 + (s[4] - '0');
ss = (s[6] - '0') * 10 + (s[7] - '0');
if (hh < 12 && s[8] == 'P') hh += 12;
if (hh == 12 && s[8] == 'A') hh = 0;
printf("%02d:%02d:%02d\n", hh, mm, ss);
return 0;
}
我似乎理解代码的基本逻辑,但在以下代码行中不确定字符串到整数的转换:
hh = (s[0] - '0') * 10 + (s[1] - '0');
mm = (s[3] - '0') * 10 + (s[4] - '0');
ss = (s[6] - '0') * 10 + (s[7] - '0');
答案 0 :(得分:1)
'0'
- 是char
'0' + x
其中x为0到9的整数
'0' + x
- 经常使用从0到9的转换整数到来自&#39; 0&#39;到&#39; 9&#39;
所以
(s[6] - '0') * 10 + (s[7] - '0')
是转换两个char字符串,如&#39; 00&#39;或&#39; 59&#39;或类似的一般情况下整数0或59
答案 1 :(得分:1)
hh = (s[0] - '0') * 10 + (s[1] - '0');
s[0]
返回char
,'0'
也是char
。
因此,您要从另一个char
中减去一个char
。当然,s[1] - '0'
也是如此。
char
实际上只是一个数字,非常像int
,只是您经常使用该类型来表示字符,例如字母或字符这种情况下,一个数字。
例如,字符'A'
很可能由您的计算机上的数字65和C ++编译器表示。
我说“很可能”因为与其他答案不同, C ++不保证ASCII 。你几乎可以在任何遇到的计算机上使用它,但是便携式代码不能假设ASCII。
就像'A'
或任何其他字母一样,数字'0'
也是幕后的整数。所有其他数字相同。是什么让你的代码工作的事实是,虽然C ++不保证ASCII,但它确保保证数字'0'
到'9'
的整数表示是连续的< / strong>即可。因此,例如,您可以实际依靠'2'
的整数表示形式为'0'
加上两个。
这当然也与ASCII表示数字的方式相匹配,使用48到57之间的数字。
其余的是简单的数学。假设字符串以“12”开头,因此s[0]
为'1'
而s[0]
为'2'
。因此保证s[0] - '0'
为1,s[1] - '0'
为2。
'0'
可以是42,'1'
43和'2'
44.或'0'
可以是48,'1'
49和'2'
50。没关系;由于上述保证,计算将始终有效。
1 * 10 = 10. 10 + 2 = 12.
我们走了:hh
是12。
当然,如果您传递一些与预期格式不完全对应的输入字符串,代码将产生混乱的结果。在真实的程序中,您将使用专用库或<chrono>
中的标准库组件来实现您的目标。
答案 2 :(得分:-1)
每个char
数据类型都由它的ascii代码存储在内存中,这是一个数字。这意味着您也可以使用它们进行算术运算。
打开任何ascii table,您将看到每个字符的数值。你可以注意到来自&#39; 0&#39; - &#39; 9&#39;有一个48-57的ascii代码。
因此,当您减去两个char值时,如:'9' - '0'
将最终执行此操作:57-48,显然为9(int 9,而不是char&#39; 9&#39;)。
答案 3 :(得分:-1)
此代码不会将字符串转换为整数,而是使用ASCII代码将字符转换为整数。见http://ascii.cl/。 这段代码是什么
hh = (s[0] - '0') * 10 + (s[1] - '0');
mm = (s[3] - '0') * 10 + (s[4] - '0');
ss = (s[6] - '0') * 10 + (s[7] - '0');
确实是通过从字符串中的字符中减去ASCII 0将时间格式的字符转换为整数。