只記錄C的字符串使用方式

C 風格字符串(最底層)

const char* s = "hello";
char buf[] = "hello";

本質:以 `'\0' 結尾的 char 數組

示例:

#include <stdio.h>

// 字符串定義
int main() {
	//printf("Hello, NDK Day 9!\n");

	// 第一種,字符串數組
	char str1[] = {'x','a','y','e','\0'};
	str1[2] = 'b';
	printf("str1: %s\n", str1);

	// 第二種
	const char* str2 = "xaye";
	//str2[2] = 'b'; // error
	printf("str2: %s\n", str2);

	// 區別 一個能修改,一個不能修改
	return 0;
}

輸出

str1: xabe                                                                                                              
str2: xaye

⚠️ 注意:

  • strlen運行時遍歷
  • 遇到 '\0' 才停
  • 沒有 '\0' 就越界(嚴重 bug)

字符串轉換

int main() {
    // 1. 字符串轉整數 (推薦用 strtol 並強制轉換,或根據平台選型)
    const char* str = "12345";
    char* endptr;
    // strtol 可以檢查是否完全轉換成功
    int num = (int)strtol(str, &endptr, 10);
    printf("num: %d\n", num);

    // 2. 字符串轉單精度浮點數
    const char* str2 = "12.345";
    float dnum = strtof(str2, NULL);
    printf("dnum: %f\n", dnum);

    // 3. 字符串轉雙精度浮點數
    const char* str5 = "3.14159";
    double ldnum = strtod(str5, NULL); // 注意:strtod 對應 double,strtold 對應 long double
    printf("ldnum: %f\n", ldnum);

    // 4. 字符串轉長整數 (處理 Windows/Linux 平台差異)
    const char* str3 = "10000000000";
    // 顯式使用 long long 保證在所有 64 位環境下都有 8 字節
    errno = 0; // 轉換前清空錯誤碼
	long long llnum = strtoll(str3, &endptr, 10);// 此處使用 strtol 就會發生溢出!

    if (errno == ERANGE) {
        printf("發生溢出!\n");
    }
    else {
        printf("llnum: %lld\n", llnum);
    }

    return 0;
}

輸出

num: 12345                                                                                                              
dnum: 12.345000                                                                                                         
ldnum: 3.141590                                                                                                         
llnum: 10000000000

C中還有一些舊式轉換寫法(不推薦使用):

atoi("123");
atol("123");
atof("1.23");

問題:

  • 不報錯
  • 不檢測溢出
  • 出錯直接返回 0(坑)

C風格推薦使用:

strtol()
strtoll()
strtod()

優點:

  • 可檢測溢出
  • 可指定進制
  • 行為明確

傳統函數 (atoi/atol)

推薦函數 (strtol/strtoll)

優勢説明

錯誤處理

失敗返回 0,無法區分“轉換失敗”還是“結果就是 0”。

可以通過 endptr 檢查字符串是否包含非法字符。

溢出檢測

行為未定義(通常直接截斷),難以調試。

會設置 errno = ERANGE,可以捕獲數值過大的情況。

進制支持

僅支持十進制。

支持 2-36 進制(如解析 0x 開頭的十六進制)。

類型匹配

類型較少。

嚴格對應 float (strtof), double (strtod), long long (strtoll)