首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

C++ 自寫字串函數返回 void 導致無法輸出的修正

     編輯:程式設計疑難解答

錯誤代碼

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...)統一返回目的指標,正是為了支援「鏈式調用」與「嵌套表達式」。自寫函數若想兼容此慣例,必須遵循相同約定。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved