我们说我已经在线阅读浏览器请求并将其保存为buff。我想从这个buff中提取一些信息,比如方法,url,versoin。所以我想用strtok_r来分割它。
假设请求是" GET http:// ******** HTTP / 1.1"。 *********是一个网站链接。我设置了某个令牌,并使用以下代码:
cmd = strtok_r(buf1, token, &saveptr);
strcpy(url, strtok_r(NULL, token, &saveptr));
version = strtok_r(NULL, token, &saveptr);
首先,如果我将令牌设置为" &#34 ;.然后,我将获得cmd =" GET",url =" http:// ********"。然而,没有" " VERSION背后。所以这可能会导致问题。
其次,如果我将令牌设置为" \ r \ n"。然后,我将获得cmd =" GET http:// ******** HTTP / 1.1",这是错误的。
所以正确的方法可以将令牌设置为" \ r \ n&#34 ;.但我不确定这个过程。谁能解释为什么这个有效???
答案 0 :(得分:1)
这里要提两件事。
strtok()
/ strtok_r()
。在解析令牌时,它会考虑分隔符数组中的每个元素。来自man page [强调我的] delim参数指定字节集,用于分隔已解析字符串中的标记。
和
解析后的字符串中的两个或多个连续分隔符字节的序列被视为单个分隔符。
strcpy(url, strtok_r(NULL, token, &saveptr));
这是编写代码非常危险的方法。如果strtok()
失败并返回NULL,请考虑恐怖。最好的方法是在另一个变量中收集strtok()
的返回值,在NULL检查后,将该变量用于strcpy()
。答案 1 :(得分:1)
strtok(和family)通过消除碰巧出现在第二个字符串中的所有字符(单个字符,而不是序列)来工作,并为您提供第一个字符串的指针不在第二个字符串上显示任何字符。它历史上用在shell sh(1)中,它使用IFS
环境变量的内容来划分输入字符串并构造argv
数组要传递给程序的字符串 exec(2)。
顺便说一句, strtok(3)和cousings使用的算法不适合解析HTTP输入,因为你需要在几个传递中进行解析(一个,使用行分隔符在行边界划分输入缓冲区,至少一秒将行划分为参数---以空格作为第二个参数)
解析http协议最好是开发一个特定的解析器o来使用语言解析技术扫描事物。有关此类实用程序的帮助,请参阅 flex(1)或 bison(1),这是unix系统中的标准配置。