2014-06-16 146 views
1

我想了解爲什麼這段代碼給我一個分段錯誤!
research是一個字符串,它打印我的令牌,但之後我有一個分段錯誤。
你能幫我嗎?分割錯誤strtok

char buf[MAX_CHARS_PER_LINE]; 
strcpy(buf, research.c_str()); 

int n = 0; 
const char * token[MAX_TOKENS_PER_LINE] = {}; 

for (n = 0; n < MAX_TOKENS_PER_LINE; n++) 
{ 
    if (n == 0) token[0] = strtok(buf, DELIMITERS); 
    else token[n] = strtok(0, DELIMITERS); 

    if (!token[++n]) break; 

    printf("%s\n", token[n]); 
} 
+1

如果沒有'MAX_TOKENS_PER_LINE'標記怎麼辦? –

+3

除了上面的藍月亮的評論,你似乎也會加1到n兩次 - 一次在for循環中,一次在break行。我不知道這是否有意或無意? – FreudianSlip

+0

很難相信這甚至應該打印第一個令牌...... – laune

回答

2

沒有預增量

if (!token[n]) break; 

複製到一個固定長度字符數組時,始終使用函數strncpy - 不STRCPY。

+2

+1,但我建議:「'n'已經在你的for循環中增加了」而不是「沒有預增量」 –

1

對不起,但您以一個非常複雜的方式處理這個問題,因此似乎失去了監督。

char buf[MAX_CHARS_PER_LINE] = {0}; /* Intialise the array properly. */ 
strncpy(buf, research.c_str(), MAX_CHARS_PER_LINE - 1); /* Take care to not overflow the target. */ 

size_t n = 0; /* size_t is the proper type to index arrays. */ 
const char * token[MAX_TOKENS_PER_LINE] = {}; 

token[n] = strtok(buf, DELIMITERS); 
while (token[n] && (n < (MAX_TOKENS_PER_LINE - 1)) 
{ 
    n++; 

    token[n] = strtok(0, DELIMITERS); 

    printf("%s\n", token[n]); 
}