【问题标题】:strtok fail at finding new line character ("\n")strtok 无法找到换行符(“\n”)
【发布时间】:2021-05-17 18:49:50
【问题描述】:

函数如下:

int parse_headers(c_request *req, char *raw_headers) {
    char *command_line;
    char *raw_header;

    req->headers = NULL;

    command_line = strtok_r(raw_headers, "\\n", &raw_headers);
    printf("command line = [%s]\n", command_line);
    if (parse_command(req, command_line) < 0)
        return -1;
    while ((raw_header = strtok_r(raw_headers, "\\n", &raw_headers))) {
        printf("\nraw header = [%s]\n", raw_header);
        parse_header(req, raw_header);
    }
    return 0;
}

raw_headers 相等:

POST www.google.fr HTTP/1.1\nUser-Agent: Mozilla/4.0 (compatible; MSIE5.01; Windows NT)\nHost: www.tutorialspoint.com\nContent-Type: text/xml; charset=utf-8\nContent-Length: 38\nAccept-Language: en-us\nAccept-Encoding: gzip, deflate\nConnection: Keep-Alive\r\n\r\n<?xml version='1.0' encoding='utf-8'?

所以strtok找到第一个\ncommand_line等于POST www.google.fr HTTP/1.1),但是在while循环中,当我打印raw_header时,它打印我raw header = [User-Age]而不是raw header = [User-Agent: Mozilla/4.0 (compatible; MSIE5.01; Windows NT)]

我能做些什么来解决这个问题?

【问题讨论】:

  • command_line = strtok_r(raw_headers, "\\n", &amp;raw_headers); 肯定是错的。

标签: c strtok trendline


【解决方案1】:

strtok_r 指定的分隔符"\\n" 由两个字符组成:'\\''n'。在User-Age之后有一个n,所以数据就在那里切了。

您应该使用"\n"strtok_r 搜索LF。

如果您真的想用多字符字符串"\\n" 分隔数据,那么strtok_r 不适合。您应该手动完成,可能使用strstr()

【讨论】:

  • 如何使用 strstr 获得与 strtok 相同的结果?再次感谢@MikeCAT
【解决方案2】:

嗯....您正在使用由反斜杠 (\) 和字符 n 组成的分隔符,而不是新行(新行必须写为 \n,而不是 \\n。您可以尝试检查它如何解析带有 n 或反斜杠的字符串,您将看到它如何在这两个字符处中断字符串。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-11-07
    • 1970-01-01
    • 1970-01-01
    • 2015-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多