只記錄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”。 |
可以通過 |
|
溢出檢測 |
行為未定義(通常直接截斷),難以調試。 |
會設置 |
|
進制支持 |
僅支持十進制。 |
支持 2-36 進制(如解析 |
|
類型匹配 |
類型較少。 |
嚴格對應 |