字符串到整数的转换c++
string to integer conversion c++
这是将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,将时间格式的字符转换为整数。
- 防止主数据类型C++的隐式转换
- 模板参数替换失败,并且未完成隐式转换
- 努力将整数转换为链表。不知道我在这里做错了什么
- HEX值到wchar_t字符(UTF-8)的转换
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 将 Qvector<uint8_t> 转换为 QString
- 如何在cuSparse中使用cusparseXcoo2csr从coo转换为csc
- 有关插入适配器的错误。[错误]请求从 'back_insert_iterator<vector<>>' 类型转换为非标量类型
- 在c++中使用nlohmann从类到json的转换
- 从"int*"强制转换为"unsigned int"会丢失精度错误
- 将Integer转换为4字节的unsined字符矢量(按大端字节顺序)
- 处理小于cpu数据总线的数据类型.(c++转换为机器代码)
- 如何使用OpenCV将RBG图像转换为HSV,并将H、S和V值保存为C++中的3个独立图像
- 复制列表初始化的隐式转换的等级是多少
- 正在将指针转换为范围
- 如何防止 c++ 在从浮点型转换为双精度型(不适用于 IO)时添加额外的小数?
- 将"打开的CV图像"中的"颜色"转换为整数格式
- 是否可以从int转换为enum类类型
- 了解 GLM- openGL 中的相机转换
- 将无符号char*转换为std::istream*C++