【问题标题】:Strtok removes first character in token CStrtok 删除标记 C 中的第一个字符
【发布时间】:2014-08-25 13:08:10
【问题描述】:

我在尝试对指向我的“自制”Http 服务器的 http 请求中的字符串进行标记时遇到了这个小问题。

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

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

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

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

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

最好的问候。

【问题讨论】:

  • bufptr的内容是什么?
  • 是来自浏览器的http get请求。
  • 好的,但是具体的内容,你能用 printf 打印到控制台吗?
  • 是的。一会儿我会在这里发帖。现在从大学回家。
  • @ThomasHolden 我认为您需要使用 \r\n 而不仅仅是 \n。你考虑过吗?

标签: c string pointers tokenize strtok


【解决方案1】:

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

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

打印:

 xbc

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

【讨论】:

    【解决方案2】:

    这工作得很好:

    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 
    

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

        对于遇到此问题的其他人。 HTTP 协议在标题行之后使用 \r\n 分隔符,并使用 CRLN 将正文与标题分开。据我所知,CRLN 是 \r\n\r\n。

        通过我在网上的搜索,我没有找到很多关于该协议的易读信息。当然,您确实有 RFC。

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-03-26
          • 2014-07-13
          • 2011-05-16
          • 2011-06-24
          相关资源
          最近更新 更多