我有一个看起来像1,3-5,7,9-11的字符串,我要通过重复调用strtok来标记它,以便输出看起来像:
1
3
5
7
9
11
我的代码如下所示:
#include <stdio.h>
#include <string.h>
void tokenize(char *string){
char *token;
token = strtok (string,"-");
while (token != NULL) {
// ... do some other unrelated stuff ...
printf("\tToken %s\n", token);
token = strtok (NULL, ",");
}
}
int main (int argc,char **argv)
{
char *token;
token = strtok (*(argv+1),",");
while (token != NULL) {
if (strchr(token,45)){ //45 is ASCII for "-".
tokenize(token);
}
printf("Token1 %s \n", token);
token = strtok (NULL, ",");
}
return 0;
}
然而,当我运行代码时,它会提前结束,我得到:
./tokenizer 1,3-5,7,9-11
Token1 1
Token 3
Token 5
Token1 3
但我希望/想要这样的东西:
./tokenizer 1,3-5,7,9-11
Token1 1
Token 3
Token 5
Token1 7
Token 9
Token 11
如果我注释掉了tokenize(temptoken);
的行(换句话说,只是strtok on“,”),那么输出看起来就像人们期望的那样:
./tokenizer 1,3-5,7,9-11
Token1 1
Token1 3-5
Token1 7
Token1 9-11
所以看起来问题确实是随后对已经标记化的字符串的strtok调用所以我试图将memcpy内存指向为令牌指针,但这并没有真正帮助:
#include <stdio.h>
#include <string.h>
void tokenize(char *string){
char *token;
token = strtok (string,"-");
while (token != NULL) {
printf("\tToken %s\n", token);
token = strtok (NULL, ",");
}
}
int main (int argc,char **argv)
{
char *token;
char *temptoken ;
token = strtok (*(argv+1),",");
while (token != NULL) {
if (strchr(token,45)){ //45 is ASCII for "-".
/* added memcpy */ memcpy(temptoken,token,strlen(token)+1);
tokenize(temptoken);
}
printf("Token1 %s \n", token);
token = strtok (NULL, ",");
}
return 0;
}
$ ./tokenizer 1,3-5,7,9-11
Token1 1
Token 3
Token 5
Token1 3-5
我可以做些什么来修复代码,了解我的误解在哪里,并获得所需的输出?
答案 0 :(得分:5)
您不能使用嵌套的chrome.runtime.onMessage.addListener(
function(request, sender, sendResponse) {
console.log(sender.tab ?
"from a content script:" + sender.tab.url :
"from the extension");
console.log("received message from popup: "+request.type);
});
,因为它使用一些静态内存来保存调用之间的上下文,以便知道被标记化的字符串中的当前位置。
使用strtok()
代替,这是strtok的可重入版本,没有任何内部状态。
答案 1 :(得分:-1)
while (token != NULL) {
if (strchr(token,45)){ //45 is ASCII for "-".
/* added memcpy */ memcpy(temptoken,token,strlen(token)+1);
tokenize(temptoken);
}
printf("Token1 %s \n", token);
token = strtok (NULL, ",");
}
你期待什么。
您正在找到令牌&#39;,&#39; 然后用你的函数对它进行标记(并打印标记) 然后你再次在subokenisation之前打印该令牌 当strtok有一个内部状态时它就结束了。
所以它的工作方式和你写的一模一样。
你需要: 使用reentrant version od strtok,
你应该返回tokenize函数中的值,以指示是否找到了subokens:如果没有打印令牌,如果是,则不是。