IP地址转换,函数嵌套调用多次返回结果为上次循环调用的结果

问题遇到的现象和发生背景

前几天做了一个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

img


实际上一般说到ip处理就是实现一个字符串分割
建议单独写一个字符串分割函数(网上分割的算法很多,我这里随便找了个),然后使用vector来保存这个几个1、2、34、5这几个字符串,然后依次将string转化成int,

使用如下

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地址字符串转为二进制表示的字符串????