2016-02-07 40 views
-1

我需要使用strtok函数来分析某些字符串中的每个单词。 我写了这样的代码:在函数strtok()中奋斗C

char *token; 
token=strtok(string,symbol); 
while(token!=NULL){ 
    functionX(token); //this is a function that anlayze the token 
    token=strtok(NULL,symbol); 
} 

但“functionX”只接收字符串和空指针的第一句话即可。 如果我把

printf("%s",token); 

,而不是functionX它打印每一块字符串。 我该如何解决这个问题?

这就是我所谓的 “functionX”:

void match(char *token, char *code){ 
FILE *rules; 
char *tmp_token; 
char stream[15]; 
int found; 
rules=fopen("rules.vk","r"); 
found=0; 
while((fgets(stream,sizeof(stream),rules))>0){ 
    tmp_token=strtok(stream,";"); 
    if((strcmp(tmp_token,token))==0){ 
     strcpy(code,strtok(NULL,";")); 
     found=1; 
    } 
} 
if(found==0) strcpy(code,token); 

}

+10

可以显示“functionX”功能码? –

+0

@MohdShahril Yup。 这是一个根据文件中写入的一些规则将每个标记与翻译关联的函数。 即: pastebin.com/rBKi1Bx0 – NosPix

+0

请发布最小版本的'functionX',它在问题*中显示错误*。添加评论链接是没有用的 - 当它是无效链接时更是如此。 –

回答

2

这是在使用strtok的难点之一。它在例程中具有内部状态,该状态跟踪最初传入的字符串中的位置(即第一个调用strtok(string, symbol);)。

当您在functionX内调用strtok时,由于此信息会更改内部指针,因此信息会混乱。然后当你回到你使用这个错误的状态。

您需要使用的是strtok_r例程,该例程保留了您必须传入strtok_r的指针的私人副本。

至于原来的子程序的例子,你可以将其更改为:

char *token; 
char *save; 
token=strtok_r(string,symbol, &save); 
while(token!=NULL){ 
    functionX(token); //this is a function that anlayze the token 
    token=strtok_r(NULL,symbol, &save); 
} 

和内部程序可以改为:

void match(char *token, char *code){ 
    FILE *rules; 
    char *tmp_token; 
    char *save; 
    char stream[15]; 
    int found; 
    rules=fopen("rules.vk","r"); 
    found=0; 
    while((fgets(stream,sizeof(stream),rules))>0){ 
     tmp_token=strtok_r(stream,";", &save); 
     if((strcmp(tmp_token,token))==0){ 
      strcpy(code,strtok_r(NULL,";", &save)); 
      found=1; 
     } 
    } 
    if(found==0) strcpy(code,token); 
}