我无法理解字符串如何转换为整数的概念

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

分钟和秒是一样的。

【讨论】:

以上是关于我无法理解字符串如何转换为整数的概念的主要内容,如果未能解决你的问题,请参考以下文章

如何解决 pentaho 数据网格中的错误?

使用函数时从整数转换为字符串

将数组中的字符转换为整数

Unity 无法从“字符串”转换为“整数”

ASP.NET、Kendo UI、CS1660:无法将 lambda 表达式转换为类型“字符串”

匿名托管的 DynamicMethods 程序集:无法将类型“字符串”隐式转换为“整数”