Ran*_*esh 2 c++ string integer
我引用了一个时间转换程序,但无法理解代码的某些部分.这是完整的计划.
#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;
}
Run Code Online (Sandbox Code Playgroud)
我无法理解的代码部分是
hh = (s[0] - '0') * 10 + (s[1] - '0');
mm = (s[3] - '0') * 10 + (s[4] - '0');
ss = (s[6] - '0') * 10 + (s[7] - '0');
Run Code Online (Sandbox Code Playgroud)
提前致谢.
如果您看到例如此ASCII表(ASCII是最常用的字符编码方案),您可以看到该字符 '2'具有十进制值50,并且该字符'0'具有十进制值48.
考虑到一个字符只是一个小整数,我们可以对它们使用常规算术.这意味着如果你这样做'2' - '0',那就像50 - 48产生小数值那样2.
因此,要获取字符数字的十进制值,只需减去'0'.
乘法10是因为我们正在处理十进制系统,其中一个数字21是相同的2 * 10 + 1.
应该注意的是,C++规范明确规定所有数字都必须在一个连续的范围内编码,因此无论使用哪种编码都无关紧要.
您可能会看到这个"技巧"也用于获取字母的十进制值,但请注意C++规范没有说明任何内容.事实上,编码中的字母范围不是连续的,而且不起作用.它仅指定用于数字.
| 归档时间: |
|
| 查看次数: |
87 次 |
| 最近记录: |