下面的代碼從含有多個結束符的字符串中分離出單詞來,需要對strtok_s有清楚的認識。這段代碼是我在寫一個處理文件中單詞個數時用來分離讀取到的字符串中的單詞時寫的,親測可用~
void ParseBuffer(CWordCounter *pCounter, CWordBuffer *buf) { char *strSrc = buf->m_buff; //緩沖塊首地址 char *strDelim = " \r\t\n"; //緩沖塊中單詞之間的分隔符 char *strToken = NULL; //指向將被處理的單詞 char *next_token = NULL; //保存緩沖塊中下一個將被讀取的單詞的位置 string str; //保存分離出來的單詞 int nWordTotalInBytes = buf->m_nWordLengthInBytes; //需要被處理的單詞總字節數 strToken = strtok_s(strSrc, strDelim, &next_token); while (1) { while (NULL != strToken) { str.assign(strToken); pCounter->InsertItem(str); strToken = strtok_s(NULL, strDelim, &next_token); }//退出循環表示該部分單詞分析的時候遇到了NULL結束符,繼續分離緩沖塊中剩下的字符 if ((next_token+2) > (strSrc+nWordTotalInBytes)) //這里最好自己用筆畫一下,不然很容易出錯! {//移動位置超過了最后一個有效字符 break; } //移動到下一個開始掃描的字符 while ( ((next_token+1) < (strSrc+nWordTotalInBytes)) //沒有超過最后一個有效字符 && !sw::IsLetter(*next_token)) { ++next_token; //++nWordProcessedInBytes; } if ((next_token+2) > (strSrc+nWordTotalInBytes)) {//移動位置超過了最后一個有效字符 break; } strToken = strtok_s(next_token, strDelim, &next_token); if ((next_token+2) > (strSrc+nWordTotalInBytes) || (NULL == strToken)) {//移動位置超過了最后一個有效字符,或者位置內容為null break; } } }
在設置過濾字符的時候注意下(這是我在實際中犯的錯誤),在過濾文本中的字符時最好加上:'\r'(回車)!