這是一道經典的新加坡程式設計師面試題,要求設計一個繼承自 C++ 標準 std::string 的 String 類別,並新增兩個成員函數:模式識別與記號提取。題目不僅考驗 C++ 繼承與運算子多載,還涉及字串處理的邏輯思維。
實作 operator/,傳入一個子字串,回傳該子字串在母字串中出現的次數。若子字串為空,回傳 0。
實作 get_token(),依序回傳字串中由空白分隔的子字串。例如 " aaa bbb cc " 依序回傳 "aaa"、"bbb"、"cc"。第四次呼叫回傳空字串,第五次重新從第一個記號開始。選擇性支援自訂分隔字元集合。
int CMyString::operator/ (const String& sub)
{
if(sub.IsEmpty())
return 0;
int count = 0;
int ret = Find(sub);
if(ret == -1)
return 0;
else if(ret <= GetLength())
{
do
{
count++;
ret = Find(sub, GetAt(ret));
} while(ret != -1);
}
return count;
}
核心邏輯:使用 Find 尋找子字串位置,找到後累加計數,並從下一字元繼續搜尋,直到無匹配為止。
CString CMyString::get_token()
{
static int callednum = 0;
int totalnum = operator/(' ');
if(totalnum == 0)
return NULL;
int tokennum, ret1 = 0, ret2 = 0;
while((ret1 = Find(' ', ret2)) != -1 && (ret2 = Find(' ', ret1)) != -1)
{
if(ret1 == ret2 - 1)
totalnum--; // 相鄰空白視為一個
return Mid(ret1, ret2 - ret1);
}
if(ret2 == -1)
return Right(GetLength() - ret1);
tokennum = totalnum;
(callednum++) %= tokennum;
}
關鍵點:
callednum 記錄呼叫次數,實現循環回傳。operator/ 計算空白總數,推算記號數量。可進一步支援自訂分隔字元集合,將分隔字元作為參數傳入 get_token,提升靈活性。此外,若使用標準庫 std::string,可結合 find_first_of、substr 等簡化實作。
此題考察類別設計、運算子多載、靜態變數應用與字串剖析邏輯。實作時需注意邊界條件(空字串、連續分隔字元、循環邏輯),代碼雖為粗略演算法,但展示核心思路,適合 MFC 初學者參考。