2012-04-28 146 views
1

我將如何將IP地址轉換爲C++字節?基本上我該如何解析IP地址?例如,如果我有一個字符串等於121.122.123.124。 我需要解析這樣的byte1 = 121,byte2 = 122,byte3 = 123,byte4 = 124C++如何將IP地址轉換爲字節?

+0

'getline'以'.'作爲分隔符值得研究。 – chris 2012-04-28 19:07:05

+0

我曾嘗試讀取一個字符,但我無法弄清楚如何讓它從字節1切換到字節2等等。被找到。 – user1128637 2012-04-28 19:43:03

回答

1

如果圖案是恆定的,數點數點等,然後使用istringstream:

#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 2012-04-28 19:41:03

+0

>>運算符是開發的,它知道如何根據您提供的變量的類型提取數據。由於您提供了一個char(名爲dot),因此將該點提取爲char。點被用作點隊長。 byte#是一個int,所以不論有多少數字,>>都會將它作爲一個int來提取,所以,是的,它會正確解析。 – 2012-04-28 21:03:58

+0

此解決方案不接受有效輸入字符串「127.1」,並且不會拒絕無效輸入字符串「300.1.1.1」。 – 2012-04-28 21:12:08

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 2012-04-28 19:13:45

+3

爲什麼不呢? AFAIK所有的C標準庫都是C++標準庫的一部分... ... – 2012-04-28 19:14:47

+0

C解決方案通常被更新的C++方法所取代。當你有C++的時候嘗試使用C是沒有必要的。 – chris 2012-04-28 19:18:15

3

使用sscanf()功能:

#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終止你的字符串?編譯器會爲你做這件事,你知道。 – 2012-04-28 19:35:18

+0

是的,你說得對。我已經從字符串文字中刪除了'\ 0'。謝謝 – 2012-04-28 19:37:38

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"; 
    } 
} 
相關問題