簡體   English   中英

字符串到整數的轉換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:%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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM