2014-06-16 147 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]); 
}