藍森林首頁 | 返回主頁 | 本站地圖 | 站內搜索 | 聯繫信箱 |
 您目前的位置:首頁 > 自由軟件 > 技術交流 > 應用編程


    

藍森林 http://www.lslnet.com 2006年6月6日 10:18


刪除一個有許多空格和TAB分割的字符串中空格和TAB的函數

我以前在回帖子中寫過,但找不到了。

char buf[MAXSIZE];
char *delsp(char *s)
{
char *cp;
    for(*buf = 0; ; s = NULL) {
      if(!(cp = strtok(s, " \t"))) break;
      strcat(buf, cp);
    }
    return buf;
}

刪除一個有許多空格和TAB分割的字符串中空格和TAB的函數

有個前輩告訴我,在有些追求速度的場合,一味的調用庫函數也不一定是最合適的。

刪除一個有許多空格和TAB分割的字符串中空格和TAB的函數

一般來講,調用庫函數的速度快。
strcpy(), strtok(), memcpy()等內部的指令是用彙編優化的。如strcpy()
是用機器碼的REPZ  MOVSW, MOVSB等,非常快。尤其是比象

while(cp)
   *dp++ = *cp++;   //一個一個地做。慢

等快多了。

刪除一個有許多空格和TAB分割的字符串中空格和TAB的函數

do not use strtok, it has already been replaced by strsep

刪除一個有許多空格和TAB分割的字符串中空格和TAB的函數

用strtok的話,在多線程環境下很有可能會出錯,因為此函數的一般實現採用了一個靜態數據區,是不可重入的。

-->

刪除一個有許多空格和TAB分割的字符串中空格和TAB的函數

老兄! 有strtok的源代碼嗎?
我習慣了些那種一個字符一個字符比的程序,我是初學者!
想下面的這個:
char        *get_str(char *ptr,char *g_str,char c)
{
        char ls_buf[256];
        int i,j,k;
        j=0;
        i=strlen(ptr);
        while(j<i)
        {
                if(ptr[j]!=c)
                j++;
                else
                break;
        }
        if(j==0)
        strcpy(g_str,"");
        else
        strncpy(g_str,ptr,j);
        g_str[j]=0;
        memset(ls_buf,'\0',sizeof(ls_buf));
        strcpy(ls_buf,ptr+j+1);
        ls_buf[strlen(ls_buf)]=0;
       
        memset(ptr,'\0',sizeof(ptr));
        strcpy(ptr,ls_buf);
        ptr[strlen(ptr)]=0;
        return  ptr;
}


我知道這樣很慢!

刪除一個有許多空格和TAB分割的字符串中空格和TAB的函數

strtok()是不可重新進入. 可以自己封鎖以下, 幹完後在開開.
strsep()也好用.
關於效率, 調用strcpy()比自己
while(*sp)
*dp++ = *sp++;
快的太多了. 因為一般CPU都有數據塊指令, strXXX()許多都用.

刪除一個有許多空格和TAB分割的字符串中空格和TAB的函數

-->
呵呵!兄弟太過執著。

刪除一個有許多空格和TAB分割的字符串中空格和TAB的函數

我感覺這個成序葉挺快的, 比較靈活的!  但我鄉找一些更快一點,保險一點,再靈活一點的!

謝謝!

刪除一個有許多空格和TAB分割的字符串中空格和TAB的函數

...



Copyright © 1999-2000 LSLNET.COM. All rights reserved. 藍森林網站 版權所有。 E-mail : webmaster@lslnet.com