字符串到整数的转换c++

string to integer conversion c++

本文关键字:转换 c++ 整数 字符串      更新时间:2023-10-16

这是将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:%02dn", 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');

'0'-是字符

'0' + x,其中x从0到9的整数

'0' + x-从0到9的常用转换整数到从"0"到"9"的字符

所以

(s[6] - '0') * 10 + (s[7] - '0')

是将两个字符字符串(如"00"或"59"或类似的字符串)转换为整数0或59(在这种情况下为)

hh = (s[0] - '0') * 10 + (s[1] - '0');

s[0]返回一个char,而'0'也是一个char

因此,您正在从另一个char中减去一个char。当然,s[1] - '0'也是如此。

char实际上只是一个数字,很像int,只是您经常使用类型来表示字符,例如字母,或者在本例中是数字。

例如,字符'A'很可能在您的计算机和C++编译器中由数字65表示。


我说"可能">,因为与其他答案不同,C++不能保证ASCII。你几乎可以在任何一台你会遇到的计算机上使用它,但可移植代码不能采用ASCII。


就像'A'或任何其他字母一样,数字'0'在幕后也是一些整数。所有其他数字也是如此。使代码工作的原因是,虽然C++不保证ASCII,但它确实保证数字'0''9'整数表示是连续的。因此,例如,实际上可以'2'的整数表示计算为'0'的1加2。

当然,这也符合ASCII表示数字的方式,使用从48到57的数字。


剩下的就是简单的数学。假设字符串以"12"开头,那么s[0]就是'1's[0]就是'2'。从而保证了CCD_ 25是1并且CCD_。

'0'可以是42、'1'43和'2'44。或者'0'可以是48、'1'49和'2'50。这并不重要;由于上述保证,计算将始终有效。

1*10=10。10+2=12。

开始:hh是12。


当然,如果您传递一些与预期格式不完全对应的输入字符串,代码将产生混乱的结果。在实际的程序中,您可以使用<chrono>中的专用库或标准库组件来实现您的目标。

每个char数据类型都通过其ascii码存储在内存中,ascii码是一个数字。这意味着您还可以使用它们进行算术运算。

打开任何ascii表,您都会看到每个字符的数值。您可以注意到,从"0"到"9"的字符具有48-57的ascii代码。

因此,当您减去两个char值(如:'9' - '0')时,最终将执行以下操作:57-48,这显然是9(int 9,而不是char"9")。

此代码不将字符串转换为整数,而是使用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,将时间格式的字符转换为整数。