2016-12-16 2 views
0

Я пытаюсь выполнить итерацию по строке запроса 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; 
    } 

} 
+1

В 'if (line [i] == "") 'вы сравниваете один символ' line [i] 'с символьной строкой' '' '. Это причина жалобы. Вы можете использовать один из 'if (line [i] ==" "[0])' (нечувствительный) или 'if (line [i] == '')' (разумный), чтобы исправить проблему. Важно понимать разницу между символьными константами в одинарных кавычках и строковыми константами в двойных кавычках. Кроме того, вы должны объявить 'parse()' до того, как вы его вызовете; компилятор предполагает, что тип возврата - 'int' (если он вообще его принимает), когда вы этого не делаете. –

+1

Обратите внимание, что (с фиксированным сравнением) вы принимаете '' GET/path/wotnot HTTP/1.0 "' как действительный, поскольку в нем есть два пробела, хотя это неверно. Думаю, вам нужен более чувствительный тест. –

+0

@JonathanLeffler Спасибо, Джонатан! Я искренне удивлен, что это вызвало проблему. Я не работал со слишком многими языками, и я никогда не понимал, что C знает разницу между «» и «». Я рассмотрю базовую концепцию. Еще раз спасибо! – Ryan

ответ

1

Вам нужен космический символ с одинарными кавычками, а не двойными кавычками.!