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

时间:2018-02-01 07:20:26

标签: 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;
}

我无法理解的代码部分是

    hh = (s[0] - '0') * 10 + (s[1] - '0');
    mm = (s[3] - '0') * 10 + (s[4] - '0');
    ss = (s[6] - '0') * 10 + (s[7] - '0');

提前致谢。

2 个答案:

答案 0 :(得分:6)

如果您看到例如this ASCII table(ASCII是最常用的字符编码方案)您可以看到字符 '2'具有小数值50,并且字符{{1具有小数值'0'

考虑到一个字符只是一个小整数,我们可以对它们使用常规算法。这意味着,如果你做,例如48'2' - '0'相同,会产生小数值50 - 48

因此,要获取字符数字的十进制值,只需减去2

'0'的乘法是因为我们正在处理十进制系统,其中10之类的数字与21相同。< / p>

应该注意的是,C ++规范明确规定所有数字都必须在一个连续的范围内编码,因此无论使用哪种编码都无关紧要。

您可能会看到这个“技巧”也用于获取字母的十进制值,但请注意C ++规范没有说明任何内容。实际上有一些编码,其中字母的范围是连续的,并且这不起作用。它仅指定用于数字。

答案 1 :(得分:2)

the ASCCI encoding中,数字按顺序编码。这是:

'/GetFolder procedure from Settings module. Sub GetFolder(txtDir As TextBox) Dim fdo As FileDialog Dim sDir As String Set fdo = Application.FileDialog(msoFileDialogFolderPicker) With fdo .Title = "Select a Directory" .AllowMultiSelect = False .InitialFileName = Application.DefaultFilePath If .Show <> -1 Then GoTo NextCode sDir = .SelectedItems(1) txtDir.Value = sDir Debug.Print txtDir.Value; sDir End With NextCode: ' GetFolder = sDir Set fdo = Nothing End Sub 的值为'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',但这是10,所以1 + *10(s[1] - '0'),所以2.总共'2'-'0'

分钟和秒钟也一样。