2010-05-07 2 views

답변

5

당신은 매개 변수의 문자열 1, 문자열 2, n은 문자열 1과 문자열 2가 문자열로

if (!strncmp("GET ", str, 4) 
{ 
    ... 
} 
else if (!strncmp("POST ", str, 5)) 
{ 
    ... 
} 
else 
{ 
    ... 
} 
+0

물론 그는 strncmp가 필요합니다. strcmp ("GET", "GET LOST")는 0을 반환하지 않습니다. – bmargulies

1

사용 strncmp를 사용할 수있는 문자의 수를 비교 N합니다. strncmp는 문자열이 일치하는 경우 0을 반환하고 문자열 1이 문자열 2보다 사전 적으로 작 으면 < 0을 반환하고 string2가 문자열 1보다 작 으면> 0을 반환합니다. 예 :

#include <string.h> 
... 
strncmp(somestring, "GET ", 4) == 0 
strncmp(somestring, "POST ", 5) == 0 
당신은 단지 몇 문자열을 구별 할 필요가있을 때 strncmp()를 사용하는이없는 않는
+1

strncmp는 입력이 일치하면 0을 반환합니다. – MSN

+0

죄송합니다. 작성을 잊어 버렸습니다. – George

1
#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; 
} 
+0

'http_method_str []'의 초기화가 끝날 때 NULL을 원할 수도 있습니다. –

+0

@Tim : 열거 형은 몇 개가 있는지 알려주고 NULL을 추가하려면 더 많은 배열 인덱스가 필요합니다. 그렇게하는 데 아무런 해를 끼치 지 않습니다 :-) –

3

:

#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()라고 부른다.

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; 
} 

내 예입니다 :

나는이 대답을 게시하도록하겠습니다하면 C 배울 계속이 모양 코드를 피하기 희망 문자열을 처리하는 방법에는 여러 가지가있다, 당신에게 정확하지 않다. 코드를 이식 가능하게 만들려면 알려진 값을 연결하는 대신 런타임에 해시 값을 결정해야합니다. 그것은 독자를위한 운동입니다 (힌트, 스위치 케이스는 상수를 원합니다).

+0

좋은 대답 .... –

+1

하지만 공간? –

+0

거듭된'else if (! strncmp (string ...') 문을 사용한 예제에 대한 주석.이 경우 문자열과 함수 포인터의 테이블이 더 깨끗한 솔루션이라고 생각합니다. 길이 매개 변수를 필요로하지 않는'str_begins()'종류의 함수 – tomlogic

관련 문제