使用strchr()从一个主字符串创建多个字符串

时间:2015-10-13 17:46:33

标签: c string char strchr

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

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

由于请求行看起来像method SP request-target SP HTTP-version CRLF,其中SP是单个空格,我是否可以通过某种方式创建使用strchr(request-line, ' ')创建string的函数(或char*char[ ])然后在下一个SP结束?

编辑:

所以我可以做类似

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

然而,不会"方法"成为SP后的每一个字符?我怎样才能修剪"什么被放入我的变量?或者我完全误解了这个功能是如何工作的?

2 个答案:

答案 0 :(得分:2)

您可以在技术上使用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);

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

答案 1 :(得分:1)

这显示了如何使用您提到的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'