[英]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:%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');
'0'
0'-是字符
'0' + x
,其中x從0到9的整數
'0' + x
常用的從0到9到char從'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'
加二。
當然,這也與ASCII表示數字的方式相匹配,使用48到57之間的數字。
其余的是簡單的數學運算。 假設字符串以“ 12”開頭,因此s[0]
為'1'
而s[0]
為'2'
。 因此可以保證s[0] - '0'
為1,而s[1] - '0'
為2。
'0'
可以是42, '1'
1'43和'2'
2'44。或者'0'
可以是48, '1'
1'49和'2'
2'50。 由於上述保證,計算將始終有效。
1 * 10 =10。10+ 2 = 12。
我們開始: hh
是12。
當然,如果您傳遞一些與預期格式不完全對應的輸入字符串,則代碼將產生混亂的結果。 在實際程序中,您將使用專用的庫或<chrono>
的標准庫組件來實現目標。
每種char
數據類型均通過其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將時間格式的字符轉換為整數。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.