2012-02-22 2 views
1

Я пытаюсь отделить IPV6-адрес от порта в C. Адрес и порт всегда будут задаваться символом «'[+ адрес +]:' + порт ' , например: «[2009: 7a4d: 80d2: 33af: 0000: 0000]: 6667». В Python, чтобы сделать это, я хотел бы сделать что-то похожее на следующее:Строка parse справа налево в C

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

Как сделать эквивалент правого налево разбора питона, то есть [-4:] в C? И, желательно, не используя регулярное выражение, как я могу сказать в C, что мне хотелось бы все между «['и»]?

Благодарим за помощь и совет!

+0

Так что в основном то, что вы ищете, является реализацией 'substr' в C? – 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); 
} 

Вы также можете написать «\ 0» в строку, как в ответ SashaN, который эффективно делит исходную строку на две части. Это не будет работать здесь, поскольку я использовал строковую константу, которая не может быть изменена. Обратите внимание, что «адрес» должен быть достаточно длинным, чтобы держать адрес во всех случаях.

«a» и «вещь» - оба указателя, поэтому (a-thing) используется, чтобы дать разницу (в символах) между началом вещи и «]».

0

Вы можете использовать strtok_r для этого:

#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

Вот функция, которая вернет подстроку между первым и последним символами в строке, предоставленной в качестве параметра. Флаг 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 */ 

В противном случае вы можете просто сканировать через строку в поисках открытых и закрытых скобок и копировать содержимое между как некоторые из другие ответы показали.

Смежные вопросы