2012-04-28 144 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"; 
    } 
} 
相关问题