2012-02-22 2 views
1

IPV6 주소를 C의 포트에서 분리하려고합니다. 주소와 포트는 항상 ''[ '+ address +'] : '+ port' 예 : "[2009 : 7a4d : 80d2 : 33af : 0000 : 0000] : 6667" 파이썬에서이 작업을 수행하기 위해, 나는 다음과 같은 일을 할 것입니다 : [-4 :], C에서문자열을 C에서 오른쪽에서 왼쪽으로 구문 분석

>>> thing = "[2009:7a4d:80d2:33af:0000:0000]:6667" 
>>> print thing[-4:] 
6667 
>>> print thing[1:30] 
2009:7a4d:80d2:33af:0000:0000 

가 어떻게 파이썬의 오른쪽에서 왼쪽으로 구문 분석의 상응하는, 즉합니까? 그리고, 정규식을 사용하지 않고, C에서 '['와 '] 사이에 모든 것을 원한다고 어떻게 말할 수 있습니까?

도움과 조언을 주셔서 감사합니다.

+0

그래서 기본적으로 C에서'substr' 구현물을 찾고 있습니까? – Eregrith

+0

나는 PHP에 너무 익숙하지 않지만, 그렇습니다. 정확하게 제가 찾고있는 것 같습니다. – user1226628

답변

-2

사람 문자열 (3C)는

portstr = strrchr(ipv6str, ':'); 
if (portstr != NULL) { 
    *portstr = '\0'; 
    portstr++; 
} 
0
char* thing = "[2009:7a4d:80d2:33af:0000:0000]:6667"; 
char ipv6[30]; 
strncpy (ipv6, thing + 1, 29); 
ipv6[29] = '\0'; 

은 원유, 그리고 단지 당신이 설명 된 고정 문자열 제약와 함께 작동합니다.

1

C에는 언어에 내장 된 문자열 조작이 없으므로 몇 가지 기능을 사용해야합니다. strrchr()은 문자열 끝에서 주어진 문자를 검색합니다. 여기에 그것을 사용하는 방법의 예는 다음과 같습니다

int main() 
{ 
    char* thing = "[2009:7a4d:80d2:33af:0000:0000]:6667"; 
    char* a=strrchr(thing,']'); /* Find the last ']' */ 
    char address[128]; /* Make somewhere new to hold the address part */ 
    strncpy(address, thing+1, a-thing-1); /* copy (a-thing)-1 characters, starting from the second character of thing, into address */ 
    printf("port: %s\n",a+2); /* a+2 is two characters from the start of a (where we found the ']') */ 
    printf("address: %s\n",address); 
} 

당신은 효과적으로 두 원래 문자열을 분할 SashaN의 대답에서와 같이 문자열에 '\ 0'을 기록 할 수 있습니다. 수정할 수없는 문자열 상수를 사용 했으므로 여기서는 작동하지 않습니다. '주소'는 모든 경우에 주소를 보유 할 수있을만큼 길어야합니다.

'a'와 'thing'이 둘 다 포인터이므로, 물건의 시작과 '] 사이에 차이 (문자)를 사용하기 위해 (물건)을 사용합니다. 실제로 거꾸로 해석하지 않은

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

int main(int argc, char *argv[]) 
{ 
    char *saveptr; 

    char *address; 
    char *port; 

    address = strtok_r(argv[1], "[]", &saveptr); 
    port = strtok_r(NULL, ":", &saveptr); 

    puts(port); 

    return EXIT_SUCCESS; 
} 

참고,하지만 당신이 제공 한 정보에서 필요한 것 같지 않습니다

0

이에 대한 strtok_r를 사용할 수 있습니다.

0

다음은 매개 변수로 제공되는 문자열의 맨 앞과 맨 마지막 문자 사이의 부분 문자열을 반환하는 함수입니다. exclusive 플래그는 결과에 해당 문자를 포함할지 여부를 알려줍니다.

strncpy()을 시도하기 전에 몇 가지 추가 유효성 검사가 필요하다고 생각하니 조심하십시오.

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

char *substr_betweenchars(char *string, char begin, char end, int exclusive) 
{ 
    char *left = strchr(string, begin); 
    char *right = strrchr(string, end); 
    char *result = 0; 

    int a = left - string; 
    int b = right - string; 
    int n = b - a + 1 - (!!exclusive << 1); 

    if (left && right) 
    { 
    result = malloc(n * sizeof(char)); 
    strncpy(result, left + !!exclusive, n); 
    } 

    return result; 
} 

int main(void) 
{ 
    char string[] = "[2009:7a4d:80d2:33af:0000:0000]:6667"; 

    printf("%s\n", substr_betweenchars(string, '[', ']', 1)); 
    printf("%s\n", substr_betweenchars(string, '[', ']', 0)); 
    printf("%s\n", substr_betweenchars(string, '8', '2', 1)); 
    printf("%s\n", substr_betweenchars(string, '8', '2', 0)); 

    return 0; 
} 

출력 :

$ gcc -Wall -o substr substr.c 

$ ./substr 
2009:7a4d:80d2:33af:0000:0000 
[2009:7a4d:80d2:33af:0000:0000] 
0d 
80d2 
0

당신이 정규식처럼 여기 sscanf()을 사용하는 것이겠습니까?

char str[] = "[2009:7a4d:80d2:33af:0000:00000]:6667"; 
char addr[30]; 
sscanf(str, "[%29[^]]]", addr); 
addr[29] = '\0'; 
printf("%s", addr); /* 2009:7a4d:80d2:33af:0000:0000 */ 

그렇지 않으면 그냥 열고 닫는 괄호를 찾고 문자열을 검색 할 수 및 몇 가지로 사이에있는 내용을 복사 : 그것은 아주 친절하게 포맷 된 문자열에서 주소를 읽을 수있는 정규식과 같은 기능이 있습니다 다른 대답이 나타났습니다.

관련 문제