2012-02-22 10 views
1

IPV6アドレスをCのポートから分離しようとしています。アドレスとポートは常に '' ['+ address +']: '+ port'たとえば、「[2009:7a4d:80d2:33af:0000:0000]:6667」と入力します。 Pythonでは、これを行うために、私は次のようなものだろう:Cで、:Cの右から左への解析文字列

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

を私はPythonの右から左へ構文解析の同等、すなわち[-4]をどのように行うのですか?そして、できれば正規表現を使わずに、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); 
} 

あなたはまた、効果的に2で、元の文字列を分割SashaNの答え、のように文字列に「\ 0」を書き込むことができます。変更できない文字列定数を使用したので、ここでは動作しません。 「アドレス」はすべてのケースでアドレスを保持するのに十分な長さでなければならないことに注意してください。

'a'と 'thing'は両方ともポインタなので、(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 */ 

そうでなければ、あなただけのオープンとクローズかっこを探している文字列をスキャンし、いくつかのようの間で内容をコピーできます他の答えが示されています。

関連する問題