C++ 繼承 C 的設計:字串 = char 陣列 + 結束空字元 (Null Terminator)。
char text[] = "This is a string."; // 17 可見字元 + 1 個 \0 = 18 bytes
編譯器自動在尾部補上 '\0'(ASCII 0),標記字串結束。這是 C 風格字串的靈魂。
char str[] = "This is a string.";
cout << str << endl; // 輸出完整字串
str[7] = '\0'; // 第 8 個字元位置植入結束符
cout << str << endl; // 僅輸出 "This is"
| 狀態 | 記憶體內容(每格 1 byte) |
|---|---|
| 修改前 | T h i s _ i s _ a _ s t r i n g . \0 |
| 修改後 | T h i s _ i s \0 a _ s t r i n g . \0 |
邏輯長度截斷於第一個 \0,但物理記憶體未變,後續資料仍殘留(不可訪問)。
'\0':字元字面值 → 整數值 0(char 型別)。"\0":字串字面值 → 含結束符的陣列(const char[2])。str[7] = '\0'; // ✅ 正確:賦予字元值 0
str[7] = 0; // ✅ 等價:0 隱式轉為 char
str[7] = "\0"; // ❌ 編譯錯誤:型別不匹配
口訣:單一字元用單引號,字串字面值用雙引號。搞錯直接編譯報錯,好debug。
cin.getline(buf, size) 自動處理結束符,比 cin >> buf 安全(後者不防溢位)。std::string 內部自動管理結束符與容量,徹底消除此類 Bug。