C語言字串與數值轉換教學:實用方法與安全技巧

1. 前言:C語言中字串與數值轉換的重要性

在C語言的程式設計中,字串與數值之間的轉換是一項非常重要的操作。特別是在處理使用者輸入或外部檔案資料時,經常需要將字串轉換為數值。相反地,為了計算結果或記錄日誌,也常常需要將數值轉換為字串。

進行這些轉換時有多種方法可選,需根據實際使用情境審慎判斷。本篇將詳細說明C語言中如何進行字串與數值的轉換,並介紹錯誤處理與安全使用的方法。

2. C語言中將字串轉換為數值的方法

利用atoi()函數進行基本字串→整數轉換

在C語言中,最基本的字串轉整數方法是使用atoi()函數。這個函數非常容易上手,但也有一些注意事項。以下為基本範例:

#include <stdio.h>
#include <stdlib.h>

int main() {
    char str[] = "123";
    int num = atoi(str);
    printf("轉換後的數值: %dn", num);
    return 0;
}

atoi()雖然簡單,但缺乏錯誤檢查。例如,遇到無效輸入時並不會報錯。下例說明atoi()遇到無效字串時的行為:

char str[] = "123abc";
int num = atoi(str);  // 只會轉換"123",其餘部分會被忽略

由於atoi()對於含有無效內容的字串,只會返回成功轉換的部分,建議在需要高度安全性的系統中避免使用此函數。

使用strtol()進行安全轉換

若需要錯誤檢查,建議使用strtol()strtol()能處理無效輸入並進行錯誤處理,也能指定基數。以下為strtol()安全轉換字串為整數的範例:

#include <stdio.h>
#include <stdlib.h>
#include <errno.h>

int main() {
    char str[] = "123abc";
    char *endptr;
    errno = 0;  // 重設錯誤狀態
    long num = strtol(str, &endptr, 10);

    if (errno != 0 || *endptr != ' ') {
        printf("轉換失敗。n");
    } else {
        printf("轉換後的數值: %ldn", num);
    }

    return 0;
}

這個範例中,利用endptr偵測無效字串部分,也透過errno判斷是否有溢位等錯誤。

3. C語言中將數值轉換為字串的方法

利用sprintf()及其風險

要將數值轉換為字串,可以使用sprintf()sprintf()依照指定格式將數值轉為字串並寫入緩衝區。但需留意緩衝區溢位的風險。以下是基本用法:

#include <stdio.h>

int main() {
    int num = 123;
    char str[10];
    sprintf(str, "%d", num);
    printf("轉換後的字串: %sn", str);
    return 0;
}

此範例雖將整數轉字串,但若轉換後長度超過緩衝區容量,會產生溢位危險。

snprintf()進行安全轉換

為避免溢位,推薦使用snprintf(),可指定緩衝區大小,超出部分會被截斷。如下範例:

#include <stdio.h>

int main() {
    int num = 12345;
    char str[5];
    snprintf(str, sizeof(str), "%d", num);
    printf("轉換後的字串: %sn", str);  // 緩衝區過小,結果為 "1234"
    return 0;
}

本例中,輸出超過緩衝區大小時,多餘部分會被切斷。snprintf()是防止溢位的安全選擇。

4. 實際範例:字串與數值的雙向轉換

C語言中經常需要雙向轉換字串與數值。下例展示利用sscanf()snprintf()來完成字串轉數值、數值轉字串:

#include <stdio.h>

int main() {
    char str[] = "12345";
    int num;
    sscanf(str, "%d", &num);
    printf("字串轉數值: %dn", num);

    char new_str[10];
    snprintf(new_str, sizeof(new_str), "%d", num);
    printf("數值轉字串: %sn", new_str);

    return 0;
}

此範例先用sscanf()將字串轉數值,再用snprintf()把數值轉回字串。這類雙向轉換非常適合資料處理與結果輸出。

5. 錯誤處理與注意事項

處理溢位與下溢

將數值轉字串時,有可能發生溢位或下溢。特別是轉換後的數值超出資料型別範圍時會產生錯誤。建議使用strtol()sscanf()時,參考下例進行錯誤處理:

if (errno == ERANGE) {
    printf("發生溢位或下溢。n");
}

檢查errno可判斷是否發生錯誤。正確處理錯誤能避免程式出現異常行為。

如何處理不合法輸入

如果字串格式不正確,數值轉換會失敗。例如像"123abc"這種字串,只會轉換數字部分,其餘會被忽略。為防止此狀況,strtol()可利用指標檢查轉換位置:

char *endptr;
long num = strtol(str, &endptr, 10);
if (*endptr != ' ') {
    printf("輸入內容不合法。n");
}

6. 結論

進行數值與字串轉換時,務必做好錯誤檢查,採用安全的方法,以確保程式穩定運作。atoi()雖然方便,但無法處理錯誤,建議多用strtol()sscanf()snprintf()等安全性高的函數。

在C語言中學會字串與數值的轉換,是每位開發者的基礎技能。掌握此技能,可寫出更穩定、可靠的程式。正確處理錯誤與記憶體管理,也能提升程式的安全性。

進階學習建議

若想進一步學習,建議參考官方文件或開源專案的程式碼。也可閱讀C語言相關的錯誤處理、記憶體管理等專書,深入提升技能。