답변
당신은 매개 변수의 문자열 1, 문자열 2, n은 문자열 1과 문자열 2가 문자열로
if (!strncmp("GET ", str, 4)
{
...
}
else if (!strncmp("POST ", str, 5))
{
...
}
else
{
...
}
물론 그는 strncmp가 필요합니다. strcmp ("GET", "GET LOST")는 0을 반환하지 않습니다. – bmargulies
사용 strncmp를 사용할 수있는 문자의 수를 비교 N합니다. strncmp는 문자열이 일치하는 경우 0을 반환하고 문자열 1이 문자열 2보다 사전 적으로 작 으면 < 0을 반환하고 string2가 문자열 1보다 작 으면> 0을 반환합니다. 예 :
#include <string.h>
...
strncmp(somestring, "GET ", 4) == 0
strncmp(somestring, "POST ", 5) == 0
당신은 단지 몇 문자열을 구별 할 필요가있을 때
strncmp()
를 사용하는이없는
않는
#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;
}
'http_method_str []'의 초기화가 끝날 때 NULL을 원할 수도 있습니다. –
@Tim : 열거 형은 몇 개가 있는지 알려주고 NULL을 추가하려면 더 많은 배열 인덱스가 필요합니다. 그렇게하는 데 아무런 해를 끼치 지 않습니다 :-) –
:
#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 배울 계속이 모양 코드를 피하기 희망 문자열을 처리하는 방법에는 여러 가지가있다, 당신에게 정확하지 않다. 코드를 이식 가능하게 만들려면 알려진 값을 연결하는 대신 런타임에 해시 값을 결정해야합니다. 그것은 독자를위한 운동입니다 (힌트, 스위치 케이스는 상수를 원합니다).
좋은 대답 .... –
하지만 공간? –
거듭된'else if (! strncmp (string ...') 문을 사용한 예제에 대한 주석.이 경우 문자열과 함수 포인터의 테이블이 더 깨끗한 솔루션이라고 생각합니다. 길이 매개 변수를 필요로하지 않는'str_begins()'종류의 함수 – tomlogic
- 1. C에서 문자열이 다른 문자열로 시작하는지 확인하는 방법은 무엇입니까?
- 2. 부분 문자열이 정규식과 일치하는지 어떻게 확인합니까?
- 3. 문자열이 쉘의 접두어 목록에서 접두어로 시작하는지 테스트하는 방법
- 4. 두 개의 html 문자열이 파이썬과 동일한 지 어떻게 확인합니까?
- 5. 문자열이 http : // 또는 https : //로 시작하는지 테스트 할 정규 표현식
- 6. JavaScript에서 정규식을 사용하여 문자열이 마침표로 시작하는지 확인하려면 어떻게합니까?
- 7. MySQL. 나는 RegExs에서 냄새가 난다. 문자열이 숫자로 시작하는지 알려주십시오.
- 8. 객관적인 C에서 변수가 매초 또는 초마다 변경되었는지 어떻게 확인합니까?
- 9. OAuth 요청을 어떻게 확인합니까?
- 10. PHP에서 호스트를 어떻게 확인합니까?
- 11. SQLite3 구문을 어떻게 확인합니까?
- 12. 네트워크 연결을 어떻게 확인합니까?
- 13. 파일 형식을 어떻게 확인합니까?
- 14. 는 어떻게 확인합니까 1
- 15. 병합이 필요한지 어떻게 확인합니까?
- 16. IsolatedStorageFile이 있는지 어떻게 확인합니까?
- 17. PrintDialog.AllowCurrentPage의 값을 어떻게 확인합니까?
- 18. 302 응답을 어떻게 확인합니까?
- 19. AJAX는 어떻게 사용자를 확인합니까?
- 20. 파일이 업로드되었는지 어떻게 확인합니까?
- 21. 어떻게 기본값을 확인합니까?
- 22. 링크가 방문했는지 어떻게 확인합니까?
- 23. POST로 페이지 매기기
- 24. 버퍼 메모리가 정렬되었는지 어떻게 확인합니까?
- 25. 특정 서비스의 상태는 어떻게 확인합니까?
- 26. 개체가 제대로 처리되었는지 어떻게 확인합니까?
- 27. Azure는 WorkerRole의 상태를 어떻게 확인합니까?
- 28. NSTimer가 실행 중인지 어떻게 확인합니까?
- 29. 자바 스크립트에서 모음을 어떻게 확인합니까?
- 30. cin에서 입력이 double인지 어떻게 확인합니까?
정말요? "c string functions"을 Google에 입력하는 것은 너무 많은 작업 이었습니까? –