Strtok删除了令牌C中的第一个字符

时间:2014-08-25 13:08:10

标签: c string pointers tokenize strtok

我试图从针对我的"自制的"的http请求中标记字符串时遇到这个小问题。 Http服务器。

基本上我正在使用这些代码行进行tokneize。

    token = strtok(bufptr, "\n");

    while(token != NULL){
        printf("%s \n", token);
        token = strtok(NULL, "\n");
    }

问题是对于每个令牌,第一个字符都从标记化字符串中删除。我该如何解决这个问题?

我试过复制字符串,我尝试过使用strstr,但我还没有成功。我敢打赌,我做错了很容易。

最好的问候。

4 个答案:

答案 0 :(得分:3)

字符串中有'\r'。 (@Alessandro Suglia)

 printf("%sx\n", "abc\r");  // x substituted for space

打印:

 xbc

'\r'(返回)将打印位置移动到行的开头。然后'x'覆盖'a'。这显示为OP观察到“第一个字符从标记化字符串中删除”。

答案 1 :(得分:0)

这很好用:

char bufptr[] = "aaaa\nbbbb\ncccc\nddd";
char *token;
token = strtok(bufptr, "\n");

while(token != NULL){
    printf("%s \n", token);
    token = strtok(NULL, "\n");
}

输出是:

aaaa 
bbbb 
cccc 
ddd 

答案 2 :(得分:0)

我使用\ r \ n作为分隔符而不是仅使用\ n来实现它 我不认为UNIX发送了\ r \ n换行,但似乎确实如此?无论如何,谢谢。

答案 3 :(得分:0)

对于遇到此问题的其他人。 HTTP协议在标题行之后使用\ r \ n分隔符,并使用CRLN从标题中分隔正文。按照我的理解,CRLN是\ r \ n \ r \ n。

从我在网上搜索,我没有找到很多关于协议的简单可读信息。当然,你确实有RFC。

感谢大家的帮助。顺便说一句,我永远无法弄清楚如何接受答案。