2017-12-09 2 views
0

문자열의 일부를 다른 문자열에 복사하려고합니다. 하위 문자열을 시작하고 끝내는 2 개의 식별자를 알고 있습니다. 또는 192 결말이 될 것 "\ 연구 nC이다 \"또는 2 : 문자열의 시작은 "호스트"입니다문자열의 하위 부분 복사

0x200085f6 <memp_memory+4502> "GET/HTTP/1.1\r\nHost: 192.168.1.200\r\nConnection 

:이 문자열에서 IP를 복사하기 위해 노력하고있어

192.168.1.200 

내가 strcpy를하고 방어 적이기를 사용하여 시도하지만 IP 그래서 나는 그것이 얼마나 오래 모르거나 무엇을 것 변수 수 있습니다 발생 그래서 원하는 출력은 "\ r에 \는 N" 최소 11 자, 최대 15 자입니다.

도와 주시면 감사하겠습니다.

+1

에 오신 것을 환영합니다, 당신의 질문을 수정하고 지금까지의 코드를 추가 ... – Grantly

+0

를 사용하여 정규 표현식을 당신은 두 가지 문제가있다하겠습니다. – iBug

답변

1

은 15 , 플러스 제로 터미네이터).

그런 다음, 당신이 말한대로, 당신은 정확하게 읽기 위치해야합니다 입력 문자열의 형식을 알고있는 경우

host = strstr(string, "Host: "); 
if (!host) { 
    // Problem. Cannot continue, the string has not the format expected. 
} 
host += strlen("Host: "); 
end = strstr(host, "\r\n"); 
if (!end) { 
    // Problem 
} 
// Sanity check: end - host must be less than 16. Someone could send you 
// Host: 192.168.25.12.Hello.I.Am.Little.Bobby.Headers\r\n 
if ((end - host) > 15) { 
    // Big problem 
} 
// We now know where the address starts, and where it ends. 
// Copy the string into address 
strncpy(address, host, (end-host)); 
// Add zero terminator to make this a C string 
address[end-host] = 0x0; 
+0

Tnx 완벽하게 작동합니다. – Dylan

0

한 가지 해결책은 Host: 은 '\ 0'로 문자열을 종료하는 것을 잊지 후

"GET/HTTP/1.1\r\nHost: 192.168.1.200\r\nConnection" till `\r` is encounter. 

시작 추출에서 number 또는 .을 모든 문자를 추출하는 것입니다.

프로그램의

간체 버전은 :

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

int main() { 

    char ip[64]; 
    char *p = NULL; 
    char *str = "GET/HTTP/1.1\r\nHost: 192.168.1.200\r\nConnection"; 
    char c; 
    int i = 0; 
    int len; 

    len = strlen("Host "); 
    p = strstr(str,"Host: "); 

    if(p) 
    {  
     while(1) 
     { 
     c = *(p+i+len); 

     if(c != '\r' && c!= '\0') 
     { 
      if(c == ' '){ 
      i++; 
      continue; 
      } 

      ip[i++] = c; 
     } 
     else 
     { 
      ip[i] = '\0'; 
      break; 
     } 

    } // while 

    } 


    printf("Ip=%s", ip); 
    return 0; 
} 

OUTPUT : 당신은 16 바이트 (최대 3 각 옥텟 바이트, 총 12 플러스 세 점의 버퍼가 필요합니다

Ip=192.168.1.200 
+0

명확하게 말하면, ''\ 0 ''일명'NUL' 바이트는 종결자가됩니다. ''0 ''문자를 추가하지 마십시오. – ShadowRanger

+0

문제는 문자열의 일부에 불과하다는 것입니다. 더 많은 숫자와 문자가 들어 있습니다. – Dylan

1

을하고 게시 된 예 입력에 의해 제안이다, sscanf()을 사용할 수 있습니다 IP 주소를 추출하는 scanset 지시어.

%*[^:]을 사용하면 sscanf()이 콜론이 나올 때까지 입력의 모든 문자를 일치시킵니다. *은 할당을 억제합니다. : 문자로 검색을 재개하므로이 문자와 일치하도록 리터럴 :을 형식 문자열에 배치해야합니다. 그런 다음 %s 지시문을 사용하여 IP 주소를 문자열과 일치시키고 저장할 수 있습니다.

#include <stdio.h> 

#define BUF_SZ 256 

int main(void) 
{ 
    const char *input = "GET/HTTP/1.1\r\nHost: 192.168.1.200\r\nConnection"; 

    char ip_address[BUF_SZ]; 
    if (sscanf(input, "%*[^:]: %255s", ip_address) == 1) { 
     puts(ip_address); 
    } 

    return 0; 
} 

프로그램 출력 : 예를 들면 다음과 같습니다

192.168.1.200