2012-04-28 10 views
1

どのようにしてC++でIPアドレスをバイトに変換できますか?基本的にIPアドレスをどのように解析するのですか?たとえば、私は121.122.123.124に等しい文字列を持っています。 このように解析する必要があります。byte1 = 121byte2 = 122byte3 = 123byte4 = 124です。C + +どのようにバイトにIPアドレスを変換するには?

+0

デリミタとして '.'を使用して' getline'を調べる価値があります。 – chris

+0

私は一度に1つのcharを読み込もうとしましたが、byte1からbyte2に切り替える方法を理解できませんでした。発見された。 – user1128637

答えて

1

パターンが一定であれば、数のドット数がなどに点在し、その後、istringstream使用:sscanf()機能を使用して

#include <sstream> 
using namespace std; 

int byte1, byte2, byte3, byte4; 
char dot; 
char *ipaddress = "121.122.123.124"; 
istringstream s(ipaddress); // input stream that now contains the ip address string 

s >> byte1 >> dot >> byte2 >> dot >> byte3 >> dot >> byte4 >> dot; 
+0

ありがとうございます。dot = '。'のようなドットを設定する必要はありません。 IPアドレスが12.34.56.123のようなものなら、これは動作しますか? – user1128637

+0

>>演算子は、それが供給する変数の型に基づいてデータを抽出する方法を知っているように、oveloadedです。 char(名前付きドット)を指定すると、ドットがcharとして抽出されます。ドットは単にスキッパーとしてドットとして使用されます。バイト#はintなので、>>は何桁の数字があってもintとして抽出するので、正しく解析されます。 –

+0

このソリューションは有効な入力文字列 "127.1"を受け入れず、無効な入力文字列 "300.1.1.1"を拒否しません。 –

0

これを試してみてください:

char ipstr[] = "121.122.123.124"; 
char *marker, *ret; 
unsigned char b1, b2, b3, b4; 
ret = strtok_r(ipstr, ".", &marker); 
b1 = (unsigned char)strtod(ret, NULL); 
ret = strtok_r(NULL, ".", &marker); 
b2 = (unsigned char)strtod(ret, NULL); 
ret = strtok_r(NULL, ".", &marker); 
b3 = (unsigned char)strtod(ret, NULL); 
ret = strtok_r(NULL, ".", &marker); 
b4 = (unsigned char)strtod(ret, NULL); 
+3

これはC++というタグが付けられています。なぜすべてのC? – chris

+3

なぜですか? AFAIKすべてのC std libはC++標準ライブラリの一部です。 –

+0

Cのソリューションは、通常、新しいC++メソッドに置き換えられます。あなたの処分でC++を使用しているときにCを使用しようとするのは少し不必要です。 – chris

3

を:

#include <cstdio> 

char arr[] = "192.168.1.102"; 
unsigned short a, b, c, d; 
sscanf(arr, "%hu.%hu.%hu.%hu", &a, &b, &c, &d); 
+1

手動で文字列をNUL終了するのはなぜですか?コンパイラはあなたのためにそれを行います。 –

+0

ええ、そうです。文字列リテラルから '\ 0'を削除しました。ありがとう –

3

使用inet_aton

#include <arpa/inet.h> 
#include <string> 
#include <iostream> 

int 
main(int argc, char *argv[]) 
{ 
    std::string s; 
    in_addr addr; 

    while(std::cin >> s && inet_aton(s.c_str(), &addr)) { 
    std::cout << inet_ntoa(addr) << "\n"; 
    } 
} 
関連する問題