給定一個十六進制字符串(如 "AfeE0f"),將其視為無符號整數加 1,結果仍以十六進制字符串形式輸出(大寫)。例如 "AfeE0f" → "AFEE10"。
toupper 將輸入字符串轉為大寫,簡化後續判斷。'F' 置 '0' 並向前進位;否則字符碼 +1 後結束循環。#include\ #include \ #include \ #include \ void StringAdd1(char *str); // 十六進制字符串加 1\ void Upstr(char *str); // 轉大寫\ int main() {\ char s[16] = "AfeE0f";\ Upstr(s);\ StringAdd1(s);\ printf("%s\\n", s);\ getchar();\ return 0;\ }\ void StringAdd1(char *str) {\ int len = strlen(str);\ while (len--) {\ if (str[len] == 'F') {\ str[len] = '0';\ } else {\ str[len] += 1;\ break;\ }\ }\ }\ void Upstr(char *str) {\ for (int i = 0; i < strlen(str); ++i) {\ str[i] = toupper(str[i]);\ }\ }
strlen 在循環條件中重複調用,建議提前存入變量優化。str[len] += 1 利用 ASCII 碼連續性:'0'-'9'、'A'-'F' 碼值連續,直接 +1 即可實現十六進制遞增('9'+1=':' 非十六進制字符,但輸入合法時不會觸發)。"FFF" → "000"),當前實現會丟失進位位。工程版需檢測循環結束後 len < 0 並前插 '1'(需動態分配或預留空間)。getchar() 暫停控制台,跨平台友好。AFEE10
#include\ #include \ #include \ #include \ bool hex_str_inc(char **str_ptr, size_t *capacity) {\ char *str = *str_ptr;\ size_t len = strlen(str);\ \ for (int i = len - 1; i >= 0; --i) {\ if (str[i] == 'F') str[i] = '0';\ else { str[i]++; return true; }\ }\ \ // 全為 F,需擴容前插 '1'\ if (*capacity <= len + 1) {\ *capacity = (len + 2) * 2;\ *str_ptr = realloc(*str_ptr, *capacity);\ str = *str_ptr;\ }\ memmove(str + 1, str, len + 1);\ str[0] = '1';\ return true;\ }\ int main() {\ char *s = strdup("FFF");\ size_t cap = 16;\ hex_str_inc(&s, &cap);\ printf("%s\\n", s); // 1000\ free(s);\ }
此版本處理緩衝區擴容、動態內存管理,適合通用庫收錄。