【问题标题】:Using strchr() to create multiple strings from one master string使用 strchr() 从一个主字符串创建多个字符串
【发布时间】:2016-01-11 14:15:46
【问题描述】:

我正在使用 C 语言编写一个程序,该程序需要我获取请求行并将其分解为后续部分。这是出于学习目的,所以我可以期待一个相当标准的请求行。

考虑到这个问题,我打算用某种for() 循环遍历请求行中的每个字符,每次遇到SP 时都会创建一个新字符串,但我想知道是否有一种使用strchr() 指向请求行的每个“片段”的方法?

由于请求行看起来像 method SP request-target SP HTTP-version CRLF ,其中 SP 是一个空格,有什么方法可以创建一个使用 strchr(request-line, ' ') 来创建 string 的函数(或 char* 或 @987654330 @) 然后在下一个 SP 结束?

编辑:

所以我可以做类似的事情

char method = strchr(request-line, ' ');

但是,“方法”不是SP 之后的每个字符吗?如何“修剪”放入变量中的内容?还是我完全误解了这个功能是如何工作的?

【问题讨论】:

  • 你认为 strtok() 在这里有用吗?
  • 我以前没听说过,但看起来很有趣。我正在谷歌上寻找更多的使用示例,而不仅仅是手册页,但是你有什么好的例子吗?
  • @komali_2 Refer here
  • strtok() 基本上接受一个字符串并将其切碎(一次一个标记)并为您提供指向每个标记的指针。在内部,它将0 放在找到分隔符的位置,并记住指针越过分隔符,并将指针传递给令牌的开头。顺便说一句,它不是线程安全的。
  • strtok 的问题在于它会修改您传递的缓冲区。只需strchr,您就可以轻松找到每个字符串的开头和结尾,这就是您创建所需的空终止字符串所需的全部内容。

标签: c string char strchr


【解决方案1】:

从技术上讲,您可以使用 strtok,但它会修改请求行,这可能是可以接受的,但并非在所有情况下都可以。这是一个通用的解决方案:

char *method, *target, *version;
const char *p = request_line, *p1;

while (*p != ' ')
{
   p++;
}
method = strndup(request_line, p - request_line);
p1 = ++p;
while (*p != ' ')
{
   p++;
}
target = strndup(p1, p - p1);
p1 = ++p;
while (*p != '\r')
{
   p++;
}
version = strndup(p1, p - p1);

正如您所期望的只有格式良好的输入,我省略了所有错误检查。

【讨论】:

  • const char *p = request_line, *p1; 是什么意思?我以前从未见过这种语法(声明中的逗号)
  • @komali_2 这只是声明了两个char * 变量。第一个 (p) 已初始化,第二个 (p1) 未初始化。这是一种令人困惑的语法,这就是为什么我更喜欢将它们分成两行。
【解决方案2】:

这显示了如何使用您提到的strchr() 函数。正如你所说,我假设字符串的每个元素之间都有一个空格。我已经掩盖了一些事情,因为我没有提供完整的作业答案。其中之一是您显示的 CRLF 之前的空间是否确实存在 - 我假设它与您显示的一样,但如果不存在,您将不得不处理这个问题,也许使用 strcspn() 而不是 strchr() .另一个亮点是假设最大长度,在现实生活中你会malloc()(以及后来的free()substring 所需的内存。

#include <stdio.h>   
#include <string.h>   

#define MAXLEN 100

int main(void)
{
    char input[] = "method request-target HTTP-version \r\n";
    char substring[MAXLEN+1];
    char *sptr, *lptr;
    int len;

    lptr = input;                                   // start of search
    while ((sptr = strchr(lptr, ' ')) != NULL) {
        len = sptr - lptr;                          // length of phrase
        if (len > MAXLEN)
            return 0;                               // simple precaution
        memcpy(substring, lptr, len);               // copy the substring
        substring[len] = 0;                         // nul-terminate it
        printf("Substring is '%s'\n", substring);   // tell us what it is
        lptr = sptr + 1;                            // advance to next search
    }
    return 0;
}

程序输出:

Substring is 'method'
Substring is 'request-target'
Substring is 'HTTP-version'

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-03-12
    • 1970-01-01
    • 2013-08-11
    • 1970-01-01
    • 1970-01-01
    • 2011-07-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多