我知道这与我的for循环有关。试图修改它,但无论我为参数添加什么,我仍然会遇到分段错误。
#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int
main(int argc, char * argv[])
{
char* request_target = "/cat.html?q=Alice hej";
// TODO: extract query from request-target
char query[20];
// finds start of query
char* startofquery = strstr(request_target, "q=");
if (startofquery != NULL)
{
int j = 0;
for (int i = strlen(request_target) - strlen(startofquery); i == ' '; i++, j++)
{
query[j] = request_target[i];
}
request_target[j] = '\0';
}
else
{
printf("400 Bad Request");
}
printf("%s", query);
}
答案 0 :(得分:4)
此行定义字符串文字
char* request_target = "/cat.html?q=Alice hej";
写入字符串文字是未定义的行为
你是在这里做的:
request_target[j] = '\0';
使用char数组
char request_target[] = "/cat.html?q=Alice hej";
此外,如果我理解正确,您正尝试从q=Alice
中提取/cat.html?q=Alice hej
。您实现的for循环有一些问题(i == ' '
),如其他答案中所述。并不是必需的。您可以非常简单地复制此部分:
char *startofquery = strstr(request_target, "q=");
char *endofquery = strchr(startofquery, ' ');
int querySize = endofquery - startofquery;
if (startofquery != NULL && endofquery != NULL) {
memcpy(query, startofquery, querySize);
query[querySize] = '\0';
}
这不容易出错,最有可能表现更好。在这种情况下,您不需要将request_target
定义为数组,但我建议将其设为const,以便在尝试编写时出现有用的编译器错误:
const char *request_target = "/cat.html?q=Alice hej";
答案 1 :(得分:0)
我能看到的两点似乎很麻烦。
,终止条件
i == ' '
应该是
request_target[i] != ' '
如果你想运行循环,直到它得到一个空格字符,或者
request_target[i] != '\0'
如果你想运行循环直到源字符串的结尾。
request_target[j] = '\0';
应为query[j] = '\0';
因为,
1)您无法修改字符串文字,它是undefined behavior。
2)可能你想要终止目标数组。
答案 2 :(得分:0)
我在你的for循环中看到两个问题。第一个是条件:
for (int i = strlen(request_target) - strlen(startofquery); i == ' '; i++, j++)
此处i
是一个整数(字符串中的位置),但您要与char(' '
)进行比较。它应该是:
for (int i = strlen(request_target) - strlen(startofquery); request_target[i] != ' '; i++, j++)
第二个问题是你在这里尝试写入字符串文字(UB):
request_target[j] = '\0';
应该是:
query[j] = '\0';