void str_cat(char* p1, char* p2) { ... }
int str_len(char* p) { ... }
cout << str_cat(p1, p2) << str_len(str_cat(p1, p2)); // 編譯錯誤
str_cat 返回 void,無法作為 operator<< 操作數。str_len(str_cat(...)) 需 str_cat 返回 char*。// 返回目的指標,支援鏈式與長度計算
char* str_cat(char* dest, const char* src) {
char* ret = dest;
while (*dest) dest++;
while ((*dest++ = *src++));
return ret;
}
size_t str_len(const char* s) {
size_t n = 0;
while (s[n]) n++;
return n;
}
int str_cmp(const char* s1, const char* s2) {
while (*s1 && *s1 == *s2) { s1++; s2++; }
return *(const unsigned char*)s1 - *(const unsigned char*)s2;
}
char buf[200] = "Hello";
char* cat = str_cat(buf, "World");
cout << cat << ' ' << str_len(cat) << endl; // HelloWorld 10
cout << str_cmp("abc", "abd") << endl; // 負值
C/C++ 標準庫字串函數(strcpy、strcat、strncpy...)統一返回目的指標,正是為了支援「鏈式調用」與「嵌套表達式」。自寫函數若想兼容此慣例,必須遵循相同約定。