Я пытаюсь выполнить итерацию по строке запроса HTTP, чтобы определить ее легитимность. В конечном счете, мой сервер не будет знать, как будет выглядеть строка запроса или как долго она будет. Предположим, что законный запрос в точности соответствует приведенному ниже. Обратите внимание, что он имеет только два пробела: один? И не внутренний ». Мне нужно выполнить итерацию по строке запроса, чтобы проверить пространство как минимум, но так как я не буду знать его длину заранее и не хочу объявите массив произвольного размера, это будет похоже на чтение шрифта Брайля. Ниже была моя попытка выяснить, содержит ли он два пробела или что-то еще. Оно вернуло ошибку, в которой говорилось, что я сравниваю ints и указатели. что, в дополнении к итерации, следующие функции могут быть полезны: strchr, зЬгср, strncmp, strncpy, strstr Любого направление будет высоко оцененоIterating Over Request Line In C
int main()
{
const char* line = "GET /path/script.cgi?field1=value1&field2=value2 HTTP/1.0";
parse(line);
}
bool parse(const char* line)
{
int spaces = 0;
int n = strlen(line);
for (int i = 0; i < n; i++)
{
if (line[i] == " ")
spaces++;
}
if (spaces == 2)
{
printf("Only 2 spaces!\n");
return true;
}
else
{
printf("Illegal request! More than two spaces! Hacker! Hacker! Help!\n");
return false;
}
}
В 'if (line [i] == "") 'вы сравниваете один символ' line [i] 'с символьной строкой' '' '. Это причина жалобы. Вы можете использовать один из 'if (line [i] ==" "[0])' (нечувствительный) или 'if (line [i] == '')' (разумный), чтобы исправить проблему. Важно понимать разницу между символьными константами в одинарных кавычках и строковыми константами в двойных кавычках. Кроме того, вы должны объявить 'parse()' до того, как вы его вызовете; компилятор предполагает, что тип возврата - 'int' (если он вообще его принимает), когда вы этого не делаете. –
Обратите внимание, что (с фиксированным сравнением) вы принимаете '' GET/path/wotnot HTTP/1.0 "' как действительный, поскольку в нем есть два пробела, хотя это неверно. Думаю, вам нужен более чувствительный тест. –
@JonathanLeffler Спасибо, Джонатан! Я искренне удивлен, что это вызвало проблему. Я не работал со слишком многими языками, и я никогда не понимал, что C знает разницу между «» и «». Я рассмотрю базовую концепцию. Еще раз спасибо! – Ryan