按字典序比較兩字符串:
返回值為首個不相等字符的 ASCII 碼差值。
int stringcompare(char *source, char *target) {
int i;
for (i = 0; source[i] == target[i]; i++) {
if (source[i] == '\0') return 0;
}
return source[i] - target[i];
}
int stringcompare(char *source, char *target) {
for (; *source == *target; source++, target++) {
if (*source == '\0') return 0;
}
return *source - *target;
}
優勢:無需索引變量,指標直接作為游標,代碼更緊湊、效率略高。
// 壓棧 *p++ = val; // 相當於 *p = val; p++; // 出棧 val = *--p; // 相當於 p--; val = *p;
這是基於指標的棧實現標準範式,利用後置/前置自增減的語義差異精確控制讀寫順序與指標位置。
| 技術點 | 說明 |
|---|---|
| 字符比較 | 直接用字符值 (ASCII/編碼值) 比較,等價於字典序 |
| 結束條件 | 雙重:字符不等 或 遇到 '\0' (同時遇到則相等) |
| 返回值語義 | 差值法:正/負/零直接指示大小關係,無需額外判斷 |
| 指標參數 | 不修改原指標值 (傳值),函數內指標移動不影響調用者 |
| const 正確性 | 標準庫聲明 int strcmp(const char*, const char*) 承諾不修改內容 |
strncmp:限制比較前 n 字符strcasecmp/stricmp:忽略大小寫 (POSIX/Windows)memcmp:比較任意內存塊,需指定長度,不依賴 '\0'// 錯誤:邏輯倒置
if (strcmp(a, b)) { /* 相等時執行 */ } // 相等返回 0 (假)!
// 正確
if (strcmp(a, b) == 0) { /* 相等 */ }
if (strcmp(a, b) < 0) { /* a < b */ }
永遠顯式比較返回值與 0,切記 0 代表相等 (假),非 0 代表不等 (真)。