xxyyzz886 2018-11-18 09:02 采纳率: 50%
浏览 672
已采纳

【C++】一个字符串分解问题

示例:TragetToIpAndProt(127.0.0.1:80|192.168.0.1:88)
数组uip[0] 可以得到 127.0.0.1的长整数型数 数组DProt[0]可以得到 80 网络字节
数组uip[1] 可以得到 192.168.0. 1的长整数型数 数组DProt[1]可以得到 88 网络字节

现在我想实现:

TragetToIpAndProt(http://www.xxx.com:80|http://www.yyy.com:88)

数组uip[0] 可以得到 http://www.xxx.com的字符串 数组DProt[0]可以得到 80 整形
数组uip[1] 可以得到 http://www.yyy.com的字符串 数组DProt[1]可以得到 88 整形

应该如何改写。。。谢谢大家。新手求教

 int   iNum = 0;
unsigned long uip[100];
u_short DProt[100];

unsigned long ResolvDNS(char *szTarget)
{
    long i;
    struct hostent *he;

    if((i=inet_addr(szTarget))<0)
        if((he=gethostbyname(szTarget))==NULL)
            return(0);
        else
            return(*(unsigned long *)he->h_addr);

        return(i);
}

void TragetToIpAndProt(char *ip/*,ULONG *pip,DWORD *pProt,int icount*/)
{
    //初始化SOCK_RAW
    WSADATA wsaData;
    if((WSAStartup(MAKEWORD(2,1),&wsaData))!=0){
        return;
    }
    char ipTemp[64] = {"0"};
    char chip[32] = {"0"},chprot[32] = {"0"};
    char *ptr = NULL,*ptr2 = NULL;

    while(*ip)
    {
        if (strstr(ip,"|") != NULL)  //如果找到分隔符说明多个目标
        {
            int len = strcspn(ip,"|");
            strncpy(ipTemp,ip,len);    //分解出其中一个IP

            if (strstr(ipTemp,":") != NULL)  //有端口
            {
                ptr = ipTemp;
                strncpy(chip,ptr,strcspn(ip,":"));
                ptr += strcspn(ip,":") + 1;
                strcpy(chprot,ptr);
                uip[iNum] = ResolvDNS(chip);
                DProt[iNum] = htons(atoi(chprot));  
            }else
            {
                uip[iNum] = ResolvDNS(ipTemp);
                DProt[iNum] = 0;
            }
            ip += strlen(ipTemp) + 1;
        }else                      //最后一个目标了
        {
            strcpy(ipTemp,ip);
            if (strstr(ipTemp,":") != NULL)
            {
                ptr2 = ipTemp;
                strncpy(chip,ptr2,strcspn(ptr2,":"));
                ptr2 += strcspn(ptr2,":") +1;
                strcpy(chprot,ptr2);
                uip[iNum] = ResolvDNS(chip);
                DProt[iNum] = htons(atoi(chprot));      
            }else
            {
                uip[iNum] = ResolvDNS(ip);
                DProt[iNum] = 0;    
            }
            ip += strlen(ipTemp);
        }


        memset(ipTemp,0,sizeof(ipTemp));
        memset(chip,0,sizeof(chip));
        memset(chprot,0,sizeof(chprot));
        iNum++;
    }

}
  • 写回答

2条回答 默认 最新

  • 任飘萍 2018-11-20 08:35
    关注

    # 根据你的要求, 修改了uip的类型, 和TragetToIpAndProt函数按":"拆分的地方, 下面附上代码和执行结果

    int iNum = 0;
    char uip[100][32];
    u_short DProt[100];
    
    void TragetToIpAndProt(char *ip)
    {
    
        char ipTemp[64] = {"0"};
        char chip[32] = {"0"},chprot[32] = {"0"};
        char *ptr = NULL,*ptr2 = NULL;
    
        while(*ip)
        {
            if (strstr(ip,"|") != NULL)  //如果找到分隔符说明多个目标
            {
                int len = strcspn(ip,"|");
                strncpy(ipTemp,ip,len);    //分解出其中一个IP
    
                if ((ptr = strrchr(ipTemp,':')) != NULL && (ptr - ipTemp) != 4)  //有端口
                {
                    strncpy(chip,ipTemp,ptr-ipTemp);
                    ptr += 1;
                    strcpy(chprot,ptr);
                    strcpy(uip[iNum],chip);
                    //uip[iNum] = ResolvDNS(chip);
                    DProt[iNum] = atoi(chprot);  
                }else
                {
                    strcpy(uip[iNum],ipTemp);
                    //ip[iNum] = ResolvDNS(ipTemp);
                    DProt[iNum] = 0;
                }
                ip += strlen(ipTemp) + 1;
            }else                      //最后一个目标了
            {
                strcpy(ipTemp,ip);
                if ((ptr2 = strrchr(ipTemp,':')) != NULL && (ptr2 - ipTemp) != 4)
                {
                    strncpy(chip,ipTemp,ptr2-ipTemp);
                    ptr2 += 1;
                    strcpy(chprot,ptr2);
                    strcpy(uip[iNum],chip);
                    //uip[iNum] = ResolvDNS(chip);
                    DProt[iNum] = atoi(chprot);      
                }else
                {
                    strcpy(uip[iNum],ipTemp);
                    //uip[iNum] = ResolvDNS(ip);
                    DProt[iNum] = 0;    
                }
                ip += strlen(ipTemp);
            }
    
    
            memset(ipTemp,0,sizeof(ipTemp));
            memset(chip,0,sizeof(chip));
            memset(chprot,0,sizeof(chprot));
            iNum++;
        }
    
    }
    
    int main(int argc, char* argv[])
    {
        char *str = "http://www.xxx.com|http://www.yyy.com:88";
        TragetToIpAndProt(str);
    
        printf("%s:%d\n%s:%d\n", uip[0], DProt[0], uip[1], DProt[1]);
    
        system("pause");
        return 0;
    }
    
    

    执行结果

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 wannier复现图像时berry曲率极值点与高对称点严重偏移
  • ¥15 利用决策森林为什么会出现这样·的问题(关键词-情感分析)
  • ¥15 DispatcherServlet.noHandlerFound No mapping found for HTTP request with URI[/untitled30_war_e
  • ¥15 使用deepspeed训练,发现想要训练的参数没有梯度
  • ¥15 寻找一块做为智能割草机的驱动板(标签-stm32|关键词-m3)
  • ¥15 信息管理系统的查找和排序
  • ¥15 基于STM32,电机驱动模块为L298N,四路运放电磁传感器,三轮智能小车电磁组电磁循迹(两个电机,一个万向轮),怎么用读取的电磁传感器信号表示小车所在的位置
  • ¥15 如何解决y_true和y_predict数据类型不匹配的问题(相关搜索:机器学习)
  • ¥15 PB中矩阵文本型数据的总计问题。
  • ¥15 MATLAB卫星二体模型仿真