首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C >> C 語言問答

C語言字符串轉整數算法詳解:atoi 手寫實現與指針運算

     編輯:C 語言問答

從字符串 "1234" 到整數 1234 的核心算法

原始函數分析

int f(char *s) {
    int k = 0;
    while (*s) 
        k = k * 10 + *s++ - '0';
    return k;  // 原代碼拼寫 retuen
}

逐步執行追蹤:f("1234")

步驟*s (字符)ASCII碼*s - '0'k (舊)k = k*10 + 數字s 指向
1'1'49100×10+1=1'2'
2'2'50211×10+2=12'3'
3'3'5131212×10+3=123'4'
4'4'524123123×10+4=1234'\0'
5'\0'0-1234循環結束-

核心技術點解析

  • *s 判斷:字符串以 '\0' (ASCII 0) 結尾,作為假值終止循環
  • *s++ 運算順序:先取值 *s,再指針後移 s++
  • -'0' 技巧:利用 ASCII 碼連續性,'0'=48, '1'=49...,相減得真實數值
  • k*10 左移:相當於十進制左移一位,騰出個位給新數字

完整可運行程序

#include <stdio.h>
#include <string.h>

int str_to_int(const char *s) {  // const 防止誤修改
    int result = 0;
    while (*s) {
        if (*s < '0' || *s > '9')  // 簡單錯誤檢查
            break;
        result = result * 10 + (*s - '0');
        s++;
    }
    return result;
}

int main() {
    char *test_cases[] = {"1234", "0", "42", "999999", "-123", "12a34"};
    int n = sizeof(test_cases) / sizeof(test_cases[0]);
    
    for (int i = 0; i < n; i++) {
        printf("str_to_int(\"%s\") = %d\n", test_cases[i], str_to_int(test_cases[i]));
    }
    return 0;
}

輸出結果

str_to_int("1234") = 1234
str_to_int("0") = 0
str_to_int("42") = 42
str_to_int("999999") = 999999
str_to_int("-123") = 0  // 簡易版不支持負號
str_to_int("12a34") = 12  // 遇非數字停止

工業級實現考慮點

  1. 溢出檢測:INT_MAX = 2147483647,需在乘 10 前檢查
  2. 負號支持:檢查首字符 '-',記錄符號位
  3. 空白字符跳過:標準 atoi/strtol 忽略前導空格
  4. 錯誤報告:strtol 通過 endptr 返回解析結束位置

標準庫替代品

#include <stdlib.h>

int val1 = atoi("1234");        // 簡易,無錯誤檢查
long val2 = strtol("1234", NULL, 10);  // 推薦,功能完整
long long val3 = strtoll("1234", NULL, 10); // 64位版本
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved