簡體   English   中英

C ++中的atoi實現

[英]atoi implementation in C++

鑒於 atoi在C ++中的實現

// A simple atoi() function
int myAtoi(char *str)
{
    int res = 0; // Initialize result

    // Iterate through all characters of input string and update result
    for (int i = 0; str[i] != '\0'; ++i)
        res = res*10 + str[i] - '0';

    // return result.
    return res;
}

// Driver program to test above function
int main()
{
    char str[] = "89789";
    int val = myAtoi(str);
    printf ("%d ", val);
    return 0;
}

這條線到底如何

res = res*10 + str[i] - '0';

將一串數字轉換為int值? (老實說,我對C ++相當不滿意。)

該標准要求數字在字符集中是連續的。 這意味着您可以使用:

 str[i] - '0'

將字符的值轉換為其等效的數值。

res * 10部分是將連續顯示的數字左移,以為要插入的新數字騰出空間。

例如,如果要將“ 123”傳遞給該函數,則在第一次循環迭代后res將為1 ,然后是12 ,最后是123

該行的每一步都有兩件事:

  1. 將所有數字左移一位小數
  2. 將當前數字放在一個位置

str[i] - '0'采用順序為“ 0123456789”的相應數字的ASCII字符,並從當前字符中減去'0'的代碼。 這樣就在字符串中的那個位置留下了一個數字,范圍為0..9。

因此,在查看示例案例時,將發生以下情況:

  1. i = 0str[i] = '8'res = 0 * 10 + 8 = 8
  2. i = 1str[i] = '9'res = 8 * 10 + 9 = 89
  3. i = 2str[i] = '7'res = 89 * 10 + 7 = 897
  4. i = 3str[i] = '8'res = 897 * 10 + 8 = 8978
  5. i = 4str[i] = '9'res = 8978 * 10 + 9 = 89789

這就是你的結果。

數字0123456789以ASCII順序顯示。

char數據類型(和文字char'0' )是整數。 在這種情況下, '0'等於48 減去此偏移量將得到數字形式的數字。

讓我們舉個例子:

str = "234";

要將其轉換為int,基本思想是像這樣處理字符串的每個字符:

res = 2*100 + 3*10 + 4
or
res = 0
step1: res = 0*10 + 2 = 0 + 2 = 2
step2: res = res*10 + 3 = 20 + 3 = 23
step3: res = res*10 + 4 = 230 + 4 = 234

現在,由於“ 234”中的每個字母實際上是一個字符而不是int,並且具有與之關聯的ASCII值

ASCII of '2' = 50
ASCII of '3' = 51
ASCII of '4' = 52
ASCII of '0' = 48

請參閱: http//www.asciitable.com/

如果我這樣做:

res = 0;
res = res*10 + str[0] = 0 + 50 = 50
res = res*10 + str[1] = 500 + 51 = 551
res = res*10 + str[2] = 5510 + 52 = 5562

那么我將獲得5562,這是我們不想要的。

記住 :在算術表達式中使用字符時,它們的ASCII值會用完(char的自動類型轉換-> int)。 因此,我們需要將字符'2'(50)轉換為int 2,我們可以像這樣完成:

'2' - '0' = 50 - 48 = 2

讓我們通過此更正再次解決它:

res = 0
res = res*10 + (str[0] - '0') = 0 + (50 - 48) = 0 + 2 = 2
res = res*10 + (str[1] - '0') = 20 + (51 - 48) = 20 + 3 = 23
res = res*10 + (str[2] - '0') = 230 + (52 - 48) = 230 + 4 = 234

234為必填項

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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