前几天做了一个IP地址转换的问题。我写的STR_2STR()的这个函数通过对字符串进行分割来将“10.0.0.0”这种的字符串转化成二进制数字。里面循环调用了TenStrToTwoStr()函数来将十进制字符串转化成二进制字符串,而TenStrToTwoStr函数里面又调用了NumStrToNum()函数来将数字字符串转化成数字。这里发现一个问题,STR_2STR()函数循环调用TenStrToTwoStr()时,它返回的结果是正确的,但是我循环结束后再调用一遍TenStrToTwoStr()时,它返回的值时循环最后一次调用返回的值!这是为什么??求解答
#include<iostream>
#include<vector>
#include<string>
#include<algorithm>
#include<math.h>
#include<sstream>
#include<Windows.h>
using namespace std;
int Interto_10Inter();
int NumStrToNum();
string TenStrToTwoStr();
string STR_2STR();
string itoa();
vector<int> Numchange_to_ip();
//二进制字符串转十进制数字
int Interto_10Inter(string s)
{
reverse(s.begin(), s.end());
int num = 0;
int len = s.size();
for (int i = 0; i < len; i++)
{
num += (s[i] - '0') * pow(2, i);
}
//cout << num << endl;
return num;
}
//数字字符串转换成数字
int NumStrToNum(string s)
{
int len = s.size();
int num = 0;
for (int i = 0; i < len; i++)
{
num += (s[i] - '0') * pow(10, len - 1 - i);
}
cout << "num=" << num << endl;
return num;
}
//十进制数字字符串转换成二进制字符串
string TenStrToTwoStr(string s)
{
int num = NumStrToNum(s);
string str = {};
while (num > 0)
{
str += (num % 2) + '0';
num /= 2;
}
reverse(str.begin(), str.end());
cout << "str=" << str << endl;
return str;
}
string STR_2STR(string s)
{
string str1 = {};
string str2 = {};
int len = s.size();
for (int i = 0; i < len; i++)
{
if (s[i] != '.')
{
str2 += s[i];
}
else
{
str1 += TenStrToTwoStr(str2);
str2 = {};
}
}
Sleep(1);
cout << "str2=" << str2 << endl;
static string str3 = str2;
str3= TenStrToTwoStr(str3);
cout << str3 << endl;
cout << str1 << endl;
return str1;
}
string itoa(long num)
{
stringstream oss;
oss << num;
return oss.str();
}
vector<int> Numchange_to_ip(long a)
{
vector<int>v;
string s;
while (a>0)
{
s += itoa(a % 2);
a /= 2;
}
int len = s.size();
if (len < 32)
{
for (int i = 0; i < (32 - len); i++)
{
s += '0';
}
}
else
{
cout << "数字过大" << endl;
}
reverse(s.begin(),s.end());
string str;
for (int j = 0; j < 32; )
{
str = {};
for (int i = 0;i<8;i++)
{
str += s[j];
j++;
}
//cout << str << endl;
v.push_back (Interto_10Inter(str));
}
return v;
}
//二进制字符串转十进制
int main()
{
/*long a = 1088;
vector<int>v=Numchange_to_ip(a);
cout << v[0] << "." << v[1] << "." << v[2] << "." << v[3] << endl;
*/
string str = "1.2.34.5 ";
//cout << "len=" << str.size() << " " << str[3] << endl;
string s = STR_2STR(str);
cout << s << endl;
string str2 = "123456";
cout << TenStrToTwoStr(str2) << endl;
//Interto_10Inter("1011000");
}
字符串分割的时候算法有问题,
你可以简单输出你的str2
使用如下
string str = "1.2.34.5 ";
vector<string> v = split(str,(const char*)".");
实现:
vector<string> split(string str, const char* szChar)
{
int pos = str.find(szChar, 0);
int first = 0;
vector<string> temp;
if (-1 == pos )//找不到分割的字符
{
temp.push_back(str);
return temp; //原路返回
}
while (pos != -1)
{
temp.push_back(str.substr(first,pos-first));
pos += 1;
first = pos;
pos = str.find(szChar,pos);
}
if (first != str.size() - 1)
{
temp.push_back(str.substr(first, str.size() - first));
}
return temp;
}
无论是IPV4还是IPV6,最终都是字符串转数字处理后,又转换会字符串而已。
你要转成什么?
由ip地址字符串转为二进制表示的字符串????