2010-07-02 76 views
2

我正在嘗試visual C++中的strtok,但它似乎不工作。這不是我第一次使用strtok,但我只是想知道它有什麼問題。代碼很簡單。strtok visual C++中的問題

在主

cout<<getLevels("/'Group'/'Channel1'")<<endl; 

在getLevels()

int getLevels(char * fullPath){ 
int level=0; 
char *nextToken; 
char * pch=strtok_s(fullPath, "/", &nextToken);// broken at here 
while(pch!=NULL){ 
    level++; 
    cout<<level<<":"<<pch<<endl; 
    pch=strtok_s(NULL, "/",&nextToken); 
} 
return level; 

} 

它打破在線路

char * pch=strtok_s(fullPath, "/", &nextToken); 

,錯誤:

Unhandled exception at 0x10273de8 (msvcr100d.dll) in tdmsTest.exe: 0xC0000005: Access violation writing location 0x0041c840. 

並且光標指向該線在strtok_s.ini

for (; *str != 0 ; str++) 
    { 
     if (map[*str >> 3] & (1 << (*str & 7))) 
     { 
      *str++ = 0; // pointing here 
      break; 
     } 
    } 

我嘗試了在的strtok()而不是strtok_s()之前,但它具有相同的問題。 任何人都可以告訴我我的代碼有什麼問題嗎?

回答

2

Strtok試圖通過插入空值代替令牌來拆分字符串。我猜猜字面上的「/'Group'/'Channel1'」是作爲常量存儲的,不能修改。

嘗試從編譯器選項中刪除「啓用字符串池(/ GF)」標誌。

+0

謝謝。你是對的。我改成\t char * temp = strdup(「/'Group'/'Channel1'」); \t cout << getLevels(temp)<< endl;它的工作原理是 。 謝謝 – Grey 2010-07-02 16:05:24

4

strtok()函數將修改爲它是參數。你在一個字符串上調用它,它通常在只讀存儲器中。

1

的問題是,你使用的行程。別那樣做!!!筆畫對頭腦不利。使用Boost.Tokenizer

+0

+1爲Tokenizer。我也建議boost :: algorithm :: split。 – 2010-07-02 18:40:12