我无法理解字符串如何转换为整数的概念
Posted
技术标签:
【中文标题】我无法理解字符串如何转换为整数的概念【英文标题】:I am not able to understand the concept how string is converted to integers 【发布时间】:2018-02-01 07:20:26 【问题描述】:我参考了一个时间转换程序,但无法理解部分代码。这是完整的程序。
#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');
提前致谢。
【问题讨论】:
那些不是字符串,它们是char
这会有所帮助,请参阅 ASCII Table - '0'
将数字从其 ASCII 字符 值转换为其实际的十进制 numeric 值。跨度>
【参考方案1】:
如果你看到例如this ASCII table(ASCII 是最常见的字符编码方案)您可以看到 字符 '2'
具有十进制值 50
,而字符 '0'
具有十进制值 @987654325 @。
考虑到一个字符实际上只是一个小整数,我们可以对它们使用正常的算术运算。这意味着如果你这样做,例如'2' - '0'
与 50 - 48
相同,生成十进制值 2
。
所以要得到一个字符数字的十进制值,只需减去'0'
。
与10
相乘是因为我们处理的是十进制 系统,其中21
等数字与2 * 10 + 1
相同。
需要注意的是,C++ 规范明确规定所有数字都必须在一个连续的范围内进行编码,因此无论使用哪种编码都可以。
您可能会看到这个“技巧”也被用于获取字母的十进制值,但请注意,C++ 规范对此没有任何说明。事实上,有些编码的字母范围不是连续的,而且这不起作用。它仅指定用于数字。
【讨论】:
【参考方案2】:在the ASCCI encoding 中,数字是按顺序编码的。这是:
'0'
的值为 48
'1'
的值为 49
'2'
的值为 50
等
因此,'x' - '0' == x
从 '0'
到 '9'
例如:
如果你有你的字符串 12:23:53
我们有:
hh = (s[0] - '0') * 10 + (s[1] - '0');
(s[0] - '0')
表示'1'-'0'
等于1
,但这是十个,所以*10
+ (s[1] - '0')
是'2'-'0'
,所以2。总共12
。
分钟和秒是一样的。
【讨论】:
以上是关于我无法理解字符串如何转换为整数的概念的主要内容,如果未能解决你的问题,请参考以下文章