Как проверить, начинается ли строка с «GET» или «POST» в c? - PullRequest
0 голосов
/ 07 мая 2010

Обратите внимание, что в нем есть пробел.

Какую функцию я могу использовать?

Ответы [ 4 ]

5 голосов
/ 07 мая 2010

Вы можете использовать

if (!strncmp("GET ", str, 4)
{ 
   ... 
} 
else if (!strncmp("POST ", str, 5)) 
{
   ...
} 
else
{
   ...
}
3 голосов
/ 07 мая 2010

У вас нет для использования strncmp(), когда нужно различать только несколько строк:

#include <stdio.h>
#include <stdint.h>
#include <string.h>

static uint32_t method_hash(const char *key)
{
        int len;
        uint32_t hash;
        int i;

        len = strlen(key);
        for (hash = 0, i = 0; i < len; i++) {
                hash += (unsigned int) key[i];
                hash += (hash << 10);
                hash ^= (hash >> 6);
        }
        hash += (hash << 3);
        hash ^= (hash >> 11);
        hash += (hash << 15);
        return hash;
}

int main(int argc, char *argv[])
{
     if (argc < 2) {
        printf("Usage: %s <method>\n", argv[0]);
        return 0;
     }

     switch(method_hash(argv[1])) {
     case 802187597:
        printf("Its GET\n");
        break;
     case 740659500:
        printf("Its POST\n");
        break;
     default:
        printf("Its RUBBISH\n");
        return 1;
     }

     return 0;
}

Обратите внимание, что хеш не защищен от коллизий, ноподходит, чтобы узнать разницу между GET и POST.Я часто использую этот маленький драгоценный камень в словарях, вызывая strncmp() только тогда, когда я думаю У меня есть совпадение.

Я отправляю этот ответ, чтобы сказать вам, что есть много способовразбирайтесь со строками, надеясь, что вы избежите кода, который выглядит следующим образом, поскольку вы продолжаете изучать C:

if (! strncmp(string, "FOO ", 4)) {
     do_this();
} else if (! strncmp(string, "BAR ", 4)) {
     do_that();
} else if (! strncmp(string, "FOOBAR ", 7)) {
     do_both();
 /* ... madness ensues through 200 more lines and 100 more else if's ... */
} else {
     return 0;
}

Мой пример не совсем верен.Вы бы хотели, чтобы значения хеш-функции определялись во время выполнения, а не просто включали известные значения, если вы хотите, чтобы код был переносимым.Это упражнение для читателя (подсказка, переключение регистров требует постоянных).

1 голос
/ 07 мая 2010
#include <stdio.h>
#include <string.h>

typedef enum httpmethod
{
    HTTP_ERR,
    HTTP_GET,
    HTTP_POST,
    HTTP_METHOD_COUNT

} httpmethod;

const char* http_method_str[HTTP_METHOD_COUNT + 1] =
{
    "UNKNOWN",
    "GET ",
    "POST ",
    0
};


httpmethod str_get_http_method(const char* str)
{
    if (!str || strlen(str) < 4)
        return HTTP_ERR;

    const char* ptr[HTTP_METHOD_COUNT];
    int i;
    int failcount = 0;

    for (i = 1; i < HTTP_METHOD_COUNT; ++i)
        ptr[i] = http_method_str[i];

    while (*str != '\0' && failcount < HTTP_METHOD_COUNT - 1)
    {
        for (i = 1; i < HTTP_METHOD_COUNT; ++i)
        {
            if (ptr[i] && *str != *ptr[i]++)
            {
                ptr[i] = 0;
                ++failcount;
            }
        }
        str++;
    }

    for (i = 1; i < HTTP_METHOD_COUNT; ++i)
        if (ptr[i])
            return i;

    return HTTP_ERR;
}


int main(int argc, char** argv)
{
    const char* test[4] = { "GET ", "POST ", "GIT ", "PAST " };

    httpmethod result = HTTP_ERR;

    int i;

    for (i = 0; i < 4; ++i)
    {
        printf("checking str: %s\n", test[i]);
        result = str_get_http_method(test[i]);
        printf("result is type: %s\n", http_method_str[result]);
    }

    return 0;
}
1 голос
/ 07 мая 2010

Используйте strncmp с параметрами string1, string2, n, где string1 и string2 - строки для сравнения, а n - количество символов. strncmp возвращает 0, если строки совпадают, или <0, если строка1 лексикографически меньше строки2, или> 0, если строка2 меньше строки1. Примеры:

#include <string.h>
...
strncmp(somestring, "GET ", 4) == 0
strncmp(somestring, "POST ", 5) == 0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...