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

C語言字串操作函數庫完整實作:從 strcpy 到 atoi 手把手教學

     編輯:關於C語言

C語言字串操作函數庫完整實作:從 strcpy 到 atoi 手把手教學

標準庫 <string.h> 提供的字串函數雖方便,但理解其底層實作能深化指標與記憶體操作功力。本文完整實作 9 個核心字串函數,含詳細註解與邊界處理。

1. 字串反轉 strRev(XOR 交換法)

void strRev(char *str) {
    assert(str != NULL);
    char *end = str + strlen(str) - 1;
    while (end > str) {
        *str ^= *end;
        *end ^= *str;
        *str ^= *end;
        str++; end--;
    }
}

使用 XOR 交換無需暫存變數,展示位運算技巧。

2. 字串複製 strcpy

char *strcpy(char *dest, const char *src) {
    assert(dest && src);
    char *ret = dest;
    while ((*dest++ = *src++));
    return ret;
}

返回原始目的地址支援鏈式呼叫。

3. 字串串接 strcat

char *strcat(char *dest, const char *src) {
    assert(dest && src);
    char *ret = dest;
    dest += strlen(dest); // 移至結尾
    while ((*dest++ = *src++));
    return ret;
}

4. 字串比較 strcmp

int strcmp(const char *s1, const char *s2) {
    assert(s1 && s2);
    while (*s1 && *s1 == *s2) { s1++; s2++; }
    return *(unsigned char *)s1 - *(unsigned char *)s2;
}

返回差值:<0, =0, >0 對應小於、等於、大於。

5. 字串長度 strlen

size_t strlen(const char *str) {
    assert(str);
    size_t len = 0;
    while (*str++) len++;
    return len;
}

6. 字串轉整數 atoi(健壯版)

int atoi(const char *str) {
    assert(str);
    int sign = 1, val = 0, started = 0;
    while (*str) {
        if (!started && (*str == '+' || *str == '-' || isdigit(*str))) {
            started = 1;
            if (*str == '-') { sign = -1; str++; continue; }
            if (*str == '+') { str++; continue; }
        }
        if (!isdigit(*str)) break; // 或報錯
        val = val * 10 + (*str++ - '0');
    }
    return sign * val;
}

7. 整數轉字串 itoa

char *itoa(int num) {
    static char buf[12]; // 足夠 32 位整數含符號
    int i = 0, neg = 0;
    if (num == 0) { buf[i++] = '0'; }
    else {
        if (num < 0) { neg = 1; num = -num; }
        while (num) { buf[i++] = '0' + num % 10; num /= 10; }
        if (neg) buf[i++] = '-';
    }
    buf[i] = '\0';
    // 反轉
    for (int l = 0, r = i - 1; l < r; l++, r--) {
        char t = buf[l]; buf[l] = buf[r]; buf[r] = t;
    }
    return buf;
}

8. 統計母音字元 countVowel

int isVowel(char c) {
    c = toupper(c);
    return (c=='A'||c=='E'||c=='I'||c=='O'||c=='U');
}
int countVowel(const char *str) {
    int cnt = 0;
    while (*str) if (isVowel(*str++)) cnt++;
    return cnt;
}

9. 判斷迴文 isPalindrome(忽略非字母)

int isPalindrome(const char *str) {
    int len = strlen(str);
    for (int i = 0, j = len - 1; i < j; i++, j--) {
        while (i < j && !isalpha(str[i])) i++;
        while (i < j && !isalpha(str[j])) j--;
        if (toupper(str[i]) != toupper(str[j])) return 0;
    }
    return 1;
}

學習總結

  • 所有函數均使用 const 正確性與 assert 防禦性程式設計
  • 指標算術運算(++, +=)是核心操作
  • 回傳 dest 使函數可串接(如 strcat(strcpy(buf, "A"), "B"))
  • 處理邊界:空指標、空字串、溢位、非預期字元

親手實作標準庫函數,是從「會用 API」進階到「懂底層」的最佳途徑。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved