2010-12-11 137 views
1

我爲一個項目使用了C風格的字符串,而且我對自己有些困惑。我正在檢查字符串以查看它們的前綴(zone_,player_等),然後獲取字符串的其餘部分。strncpy()得到字符串的結尾

else if(strncmp(info, "zone_", 5) == 0) 
{ 
    int len = strlen(info); 
    char *zoneName = new char[len]; 
    strncpy(zoneName, &info[5], len-5); 

    Msg("Zone Selected: %s\n", zoneName); 
    delete zoneName; 
} 

雖然我打印出zoneName變量,但它是正確的,除了後面跟着一堆亂碼。我究竟做錯了什麼? (我知道的廢話是char數組是空的休息,但我不知道一個更好的方式來做到這一點)

+5

爲什麼你在C++中再次使用C字符串? – 2010-12-11 10:01:18

+2

'delete [] zoneName;',* not *'delete zoneName;'。 – 2010-12-11 12:08:18

回答

1

你必須記住C風格的字符串以NUL字符結尾。你在zoneName分配足夠的空間,但你只需要len-5加一:

char *zoneName = new char[len - 5 + 1]; 

然後,你可以實際使用strcpy()複製串的末尾:

strcpy(zoneName, &info[5]); 

你不需要指定長度,因爲源字符串是NUL終止的。

0

C字符串是零結尾的 - 所以他們佔據len字節(字符要準確)再加上一個零值,稱爲「零終止符」。您需要分配一個或多個字符,並可以複製一個從多個源(因爲它應該是零終止)或剛剛設置的目的地的最後一個字符爲0

int len = strlen(info); 
char *zoneName = new char[len - 5 + 1]; 
strncpy(zoneName, &info[5], len - 5 + 1); 
0

C風格的字符串必須是完成一個零值的字節。你應該這樣修改你的代碼:

char *zoneName = new char[len-5+1]; 
strncpy(zoneName, &info[5], len-5); 

/* correct string ending */ 
zoneName[len]=0; 

/* Now, it's safe to print */ 
Msg("Zone Selected: %s\n", zoneName); 
2

參見strncpy描述:

沒有空字符是隱含 附加到目的地的端部,所以 目的地將只 空終止如果在源與c 字符串的長度是少於號碼