公告版位
星落的瞬間!放棄的後悔是永遠!

參考:http://www.cnblogs.com/oomusou/archive/2009/05/09/c_split.html

wstrings split(const wchar_t *str, const wchar_t *del )
{
    int len = wcslen(str);
    std::vector<wchar_t> tstr;
    tstr.resize(len+1);
    wcscpy(&tstr[0], str);
    wstrings strs;
    wchar_t *s = wcstok(&tstr[0], del);
    while(s != NULL) {
        strs.push_back(s);
        s = wcstok(NULL, del);
    }
    return strs;
}

strings split(const char *str, const char *del )
{
    int len = strlen(str);
    std::vector<char> tstr;
    tstr.resize(len+1);
    strcpy(&tstr[0], str);
    strings strs;
    char *s = strtok(&tstr[0], del);
    while(s != NULL) {
        strs.push_back(s);
        s = strtok(NULL, del);
    }
    return strs;
}

測試碼

strings ss = split("10,-20,-30", ",");
    for (int i=0;i<ss.size();i++)
    {
        std::cout << ss[i] << std::endl;
    }

修改後

strings split(const char *str, const char *del )
{
    int    len = strlen(str),
        dlen = strlen(del),
        lastindex = 0,
        index = 0;
    strings strs;
    std::string tstr;
    tstr.reserve(128);
    int i;
    for (i=0;i<len;i++)
    {
        for (int j=0;j<dlen;j++)
        {
            if (del[j] == str[i])
            {
                if (i-lastindex > 1)
                {
                    tstr.assign(str+lastindex, str+i);
                    strs.push_back(tstr);
                    lastindex = i+1;
                }   
                else
               {
                    lastindex = i+1;
               }
            }
        }
    }
    tstr.assign(str+lastindex, str+i);
    strs.push_back(tstr);
    return strs;
}

測試碼

strings ss2 = split("40,-50 -60.-70", ", .");
    for (int i=0;i<ss2.size();i++)
    {
        std::cout << ss2[i] << std::endl;
    }

讓地獄深紅的天亮 發表在 痞客邦 PIXNET 留言(1) 人氣()


留言列表 (1)

發表留言
  • novus
  • 1. 將一串東西指定給 STL Container 最簡單的方法是
    std::vector<char> tstr(str, str + strlen(str));

    tstr.assign(str, str + strlen(str));

    舉另一個例子,要把整個文字檔載入字串就像這樣
    ifstream fin(...);
    string s((istreambuf_iterator<char>(fin)), istreambuf_iterator<char>());


    2. 你會寫成這樣應該是已經發現原作的重大缺陷了
    (附帶一提,該作者的問題程式一堆,不過他既然不開放留言就算了)

    strtok需要可寫空間,但是動態配置往往是效能大敵。這個問題其實不必額外配置可寫空間,只要掃描字串一次就夠了。
    並且 strtok 是一個最好不要用的函數
    你可以考慮使用 find_first_of 然後再仿製 std::string 的 find_first_not_of,就可以把 strtok 丟掉了
  • 了解,我試試。

    讓地獄深紅的天亮 於 2011/01/28 01:23 回覆

【 X 關閉 】

【PIXNET 痞客邦】國外旅遊調查
您是我們挑選到的讀者!

填完問卷將有機會獲得心動好禮哦(注意:關閉此視窗將不再出現)

立即填寫取消