使用 strchr() 从一个主字符串创建多个字符串
Using strchr() to create multiple strings from one master string
我正在为一个 class 开发一个 C 程序,它要求我获取请求行并将其分解为后续部分。这是出于学习目的,所以我可以期待一个相当标准的请求行。
考虑到这个问题,我打算使用某种 for()
循环遍历请求行中的每个字符,每次遇到 SP
时都会创建一个新字符串,但是我想知道是否有办法使用 strchr()
指向请求行的每个 "piece"?
由于请求行看起来像 method SP request-target SP HTTP-version CRLF
,其中 SP
是单个 space,有什么方法可以创建一个使用 strchr(request-line, ' ')
来创建的函数一个 string
(或 char*
或 char[ ]
)然后在下一个 SP
结束?
编辑:
所以我可以做类似的事情
char method = strchr(request-line, ' ');
但是,"method" 不是 SP
之后的每个字符吗?我怎样才能 "trim" 将什么放入我的变量中?或者我完全误解了这个功能是如何工作的?
从技术上讲,您可以使用 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);
正如您所期望的只有格式正确的输入,我省略了所有错误检查。
这显示了如何使用您提到的 strchr()
功能。正如您所说,我假设字符串的每个元素之间有一个 space 。我已经掩盖了一些事情,因为我没有提供完整的家庭作业答案。其中之一是您显示的 CRLF
之前的 space 是否确实存在 - 我假设它确实存在,但如果不存在,您将不得不处理它,也许可以使用 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'
我正在为一个 class 开发一个 C 程序,它要求我获取请求行并将其分解为后续部分。这是出于学习目的,所以我可以期待一个相当标准的请求行。
考虑到这个问题,我打算使用某种 for()
循环遍历请求行中的每个字符,每次遇到 SP
时都会创建一个新字符串,但是我想知道是否有办法使用 strchr()
指向请求行的每个 "piece"?
由于请求行看起来像 method SP request-target SP HTTP-version CRLF
,其中 SP
是单个 space,有什么方法可以创建一个使用 strchr(request-line, ' ')
来创建的函数一个 string
(或 char*
或 char[ ]
)然后在下一个 SP
结束?
编辑:
所以我可以做类似的事情
char method = strchr(request-line, ' ');
但是,"method" 不是 SP
之后的每个字符吗?我怎样才能 "trim" 将什么放入我的变量中?或者我完全误解了这个功能是如何工作的?
从技术上讲,您可以使用 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);
正如您所期望的只有格式正确的输入,我省略了所有错误检查。
这显示了如何使用您提到的 strchr()
功能。正如您所说,我假设字符串的每个元素之间有一个 space 。我已经掩盖了一些事情,因为我没有提供完整的家庭作业答案。其中之一是您显示的 CRLF
之前的 space 是否确实存在 - 我假设它确实存在,但如果不存在,您将不得不处理它,也许可以使用 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'