字符串到整数转换c ++

时间:2017-01-21 08:56:11

标签: c++ string

这是将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');

4 个答案:

答案 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将时间格式的字符转换为整数。