【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++;
    }

}
0

2个回答

# 根据你的要求, 修改了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;
}

执行结果

0
xxyyzz886
xxyyzz886 我在前段时间已经解决了..类似写法。非常感谢您的解答。答案已采纳。祝你生活愉快。
9 个月之前 回复
0
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
最优分解问题 (intDiv.cpp)
最优分解问题 (intDiv.cpp) 【题目描述】     设n是一个正整数,现在要求将n分解为若干互不相同的自然数的和,且使这些自然数的乘积最大。 【解题思路】     若a+b=const,则|a-b|越小,a*b越大。     运用贪心算法:将n分成从2开始的连续自然数的和,如果最后剩下一个数,将此数在后项优先的方式下均匀地分给前面各项。 例如:     n先分成2、3…
关于C语言解决正序整数分解的问题
整数分解即,把每一位拆开输出,例如12365,输出结果是1 2 3 6 5。大概思路:12365/10000=12365/1000=2365/100=365/10=65/1=5这样计算可以得到每一位数。所以需要一个变量,来得到每一次需要除以的10的倍数。#include &amp;lt;stdio.h&amp;gt; int main() { int x; scanf(&quot;%d&quot;, &amp;amp;x); in...
贪心算法:最优分解问题
问题描述:设n是一个正整数,现要求将n分解为若干个互不相同的自然数的和,使这些自然数的乘积最大.代码如下:int BestMul(int n) { int i,j,mul=1; int num; //初始化一个数组,用来存放分解后的每个数 int a[MAX] = {0}; a[0]=2; num=n-2; //利用for循环来从2开始递增,每
java 分解字符串
java 分解字符串 java 分解字符串 java 分解字符串
贪心算法-最优分解
最有分解问题    问题描述:          设 n 是一个正整数。现在要求将 n 分解为若干互不相同的自然数的和,且使这些自然数的乘积最大。如 10 = 3+7 =                   4+6 = 2+3+5 = ……           最大乘积为:2 * 3 * 5 = 30    问题分析:           整数的一个性质:若 a + b =N(常数),则| a -...
整数分解
改自:https://blog.csdn.net/summerxiachen/article/details/62421985 整数分解 在数学中,整数分解(英语:integer factorization)又称素因数分解(prime factorization),是将一个正整数写成几个约数的乘积。例如,给出45这个数,它可以分解成9×5。根据算术基本定理,这样的分解结果应该是独一无二的。这个...
最优分解问题(C语言)--贪心策略
最优分解问题 题目描述 设n是一个正整数,现在要求将n分解为若干个互不相同的自然数的和,使这些自然数的乘积最大。 解题思路 根据数学中和定近积大,积定近和小的原则,可得 1、若a+b等于一个常数,则|a-b|越小,a*b就越大。要使得加数互不相同,又尽可能集中,那加数只能是连续的自然数了。 2、一个数能分解,分解后乘积会比之前更大。 具体代码实现 #include &lt;stdio.h&gt; ...
C语言最大的乘积问题
最大乘积 Time Limit: 3000ms, Memory Limit: 10000KB , Accepted: 3506, Total Submissions: 6137 Description 输入n个元素组成的序列S,你需要找出一个乘积最大的连续子序列。如果这个最大的乘积不是正数,输出-1表示无解。1≤n≤18,-10≤Si≤10。 Input 第1行输入n,整数 第2行n
质数分解
质数分解 关键函数在于循环中的break语句; 需要注意的是,break语句的存在会让程序跳出当前的循环,如果是嵌套循环,组合跳出当前break存在的最里层的嵌套循环 #include&amp;lt;iostream&amp;gt; using namespace std; int main(){ int a; while (cin &amp;gt;&amp;gt; a){ while (a != 1){ ...
整数因子分解问题的递归算法
问题描述: 大于1 的正整数n可以分解为:n=x1*x2*…*xm。 算法设计: 对于给定的正整数n,编程计算n共有多少种不同的分解式。 例如,当n=12 时,共有8 种不同的分解式: 12=12; 12=6*2; 12=4*3; 12=3*4; 12=3*2*2; 12=2*6; 12=2*3*2; 12=2*2*3。 数据输入: 由文件input.txt给出输入数据。第一行有1 个正整数n (1≤n≤2000000000)。 结果输出: 将计算出的不同的分解式总数输出到文件output.txt。 输入文件示例: 12 输出文件示例: 8
最长公共子串问题
问题描述 给出两个字符串,找到最长公共子串,并返回其长度。 Example : 给出A=“ABCD”,B=“CBCE”,返回 2 牛客地址 LintCode地址 问题分析 与 最长公共子序列(Longest Common Subsequence)问题 不同,该题是求最长公共子串的长度,子串必须要求连续,而子序列则可以不连续。针对子串这一特点,设置的状态也有所不同。 最长公共子序列是属...
整数分解并正序输出-C语言
学习了大概两周的C语言基础,今天终于进行了第一次做了一个比较搞脑子的程序,虽然代码是我自己一个一个敲的,但是,是在MOOC上的C语言入门课做的反馈。 很多时候我觉得,学习代码一定要自己手敲一遍,虽然手敲的速度非常的慢,但是我保证如果听课的理解是50%,那么手敲代码会让你理解80%,有人问还有20%去哪了,哈哈那就再实战中获取吧。 第一篇博客,往往词不达意,还望谅解。 ...
百炼-2749-分解因数-C语言-递归算法
为了方便举一反三,从本篇博客起附带题目。 描述 给出一个正整数a,要求分解成若干个正整数的乘积,即a = a1 * a2 * a3 * ... * an,并且1 输入 第1行是测试数据的组数n,后面跟着n行输入。每组测试数据占1行,包括一个正整数a (1 输出 n行,每行输出对应一个输入。输出应是一个正整数,指明满足要求的分解的种数 /**********************
C入门——分解质因数
题目内容:每个非素数(合数)都可以写成几个素数(也可称为质数)相乘的形式,这几个素数就都叫做这个合数的质因数。比如,6可以被分解为2x3,而24可以被分解为2x2x2x3。现在,你的程序要读入一个[2,100000]范围内的整数,然后输出它的质因数分解式;当读到的就是素数时,输出它本身。提示:可以用一个函数来判断某数是否是素数。输入格式:一个整数,范围在[2,100000]内。输出格式:形如:n=a
最优分解问题-贪心算法
问题描述:设你是一个正整数。现在要求将n分解为若干互不相同的自然数之和,且使这些自然数的乘积最大。 问题分析: (1)对于n<=4 可以验证其分解成几个正整数的和的乘积是小于n的。 (2)对于n>4,能证明其能分解成几个数的和使得乘积不小于n。如果分解成1和n-1,那么对于乘积是没有帮助的;因此假设n分解成a和n-a(2<=a<=n-2),如果a和n-a仍然大于4,那么继续分解直至a,n-a
算法 最优分解问题
题目设n是一个正整数,现在要求将n分解为若干个互不相同的自然数的和,使这些自然数的乘积最大。 输入 10 输出 30 分析贪心算法。如果a+b=n,则|a-b|越小,那么a*b越大,如老师所讲,可以将n分解成从2开始的连续自然数的和。 例如:输入n=10,则可以分解为 2、3、4,还剩下1不够5,把这个1倒着加,4 -> 5。 所以,最终分解为2,3,5,结果为2*3*5=
拆解字符串
1问题描述连续输入一串字符串(长度不超过100),请按字符串长度为10拆分每个字符串后,将拆分的字符串输出到新的字符串数组;长度不是10整数倍的字符串请在后面补字符@,空字符串不用处理。输入格式连续输入字符串,字符串长度小于100输出格式输出到长度为10,的新字符串数组,打印新字符串数组值2方法(1)设置一个临时空字符串temp和一个整数j;每遍历字符串s中的一个字符,j++,temp=temp+...
根据所提供的分解字符对目标字符串进行分解-----strtok()、strtok_r()
根据所提供的分解字符对目标字符串进行分解-----strtok()、strtok_r()
一个字符串分解问题
string time="12点25分";rnint h,m;rn怎么才能把time分解成:h = 12; m = 25;rn谢谢!
C语言递归法进行素数分解
用C语言编写的递归法素数分解程序,相信对大家有用。初学C的同学很适用,老师经常布置的题目哦
按要求分解字符串,输入两个数M,N;M代表输入的M串字符串,N代表输出的每串字符串的位数,不够补0。例如:输入2,8, “abc” ,“123456789”,则输出为“abc00000”,“12345
按要求分解字符串,输入两个数M,N;M代表输入的M串字符串,N代表输出的每串字符串的位数,不够补0。例如:输入2,8, “abc” ,“123456789”,则输出为“abc00000”,“12345678“,”90000000” #include <iostream> #include "string" using namespace std; void main() { int m,n;
CString 字符串拆分
CString str=_T("sddfsdf通道:各色如果通道")//获取:右侧 str.Right//获取的不低,由于有中文字符 str.Delete(0,str.Find(_T(":")+1);
整数因子分解问题(递归)
问题描述:将一个整数分解成整数因子相乘,共有多少种不同的分解式? 问题分析:这个问题其实很简单,将一个数n从2到它本身依次求余,如果发现n求余后为0,证明这个被求余的数i是这个整数的因子,那么我们对n/i再进行递归,直到n/i变为1停止递归。 分析完毕,代码如下: #include &lt;stdio.h&gt; int count = 0 ; void calculate(int n...
分治算法——整数因子分解问题
Problem Description 大于1的正整数n可以分解为:n=x1*x2*…*xm。例如,当n=12 时,共有8 种不同的分解式: 12=12; 12=6*2; 12=4*3; 12=3*4; 12=3*2*2; 12=2*6; 12=2*3*2; 12=2*2*3。 对于给定的正整数n,计算n共有多少种不同的分解式。 Input 输入数据只有一行,有1个正整数n ...
java字符串的作业题字符串分解
-------------------------java字符串的作业题字符串分解--------------- 定义一个方法,传入字符串格式为(idcard:name:age:gender)的分割形式如  &quot;120384722312901:kexin:20:1|  3219212131312:haotao:22:1|  120121121312:zhangmeiling:21:2&quot;  将该字符串...
使用C语言实现字符串分割
之前分享了一篇使用C++(std::string 作为容器)进行字符串分割的博文: https://blog.csdn.net/r5014/article/details/82802664   现在又想用C语言做一个字符串分割的函数,大概功能是这样: 需要分割的字符串“    this is a charactor  raw.    ” 使用 ' '分割 分割之后会返回一个char** ...
整数因子分解问题
Problem Description  大于1 的正整数n可以分解为:n=x1*x2*…*xm。 例如,当n=12 时,共有8 种不同的分式: 12=12; 12=6*2; 12=4*3; 12=3*4; 12=3*2*2; 12=2*6; 12=2*3*2; 12=2*2*3。 编程任务:  对于给定的正整数n,编程计算n共有多少种不同的分解式。  Input
分解质因数-week6-C语言习题集
分解质因数(5分) 题目内容: 每个非素数(合数)都可以写成几个素数(也可称为质数)相乘的形式,这几个素数就都叫做这个合数的质因数。比如,6可以被分解为2x3,而24可以被分解为2x2x2x3。现在,你的程序要读入一个[2,100000]范围内的整数,然后输出它的质因数分解式;当读到的就是素数时,输出它本身。提示:可以用一个函数来判断某数是否是素数。输入格式: 一个整数,范围在[2,10000
数位拆解
数位拆解即把一个给定的数字各个数位上的数字拆开,如1234即拆成1,2,3,4。 题目描述: 写个算法,对2个小于1000000000的正整数,进行拆分后按如下示例求结果 示例:123*45 = 1*4+1*5+2*4+2*5+3*4+3*5 = 54 样例输入:  123 45 样例输出:  54 问题分析:  一个四位正整数x,可以写为:         x=a*1
JAVA中URL类的分解
一共有9个公共方法,都是通过分解URL来得到特定的结果,所以想要方法起作用必须要有完整的URL getFile()   方法返回一个String,包含URL的路径部分和文件部分(从主机名之后的第一个(/)开始,到片段标识符(#)之前),被认为是文件部分),如果没有文件部分,则会把字符串设为null。 getHost()  返回一个String,为URL中包含的主机名,下面代码将会返回bai...
递归算法之因子分解
例一以20为例递归过程为#include &amp;lt;iostream&amp;gt; #include &amp;lt;string&amp;gt; #include &amp;lt;algorithm&amp;gt; #include &amp;lt;string.h&amp;gt; using namespace std; int sum; void cnt(int n,int min)//min这个参数保证因子是递增的 { for(int ...
java方法根据符号分解字符串
java分解字符串有两种方法; 一、一种是Tokenizer StringTokenizer st = new StringTokenizer("this is a test"); while (st.hasMoreTokens()) { System.out.println(st.nextToken()); } 输出以下字符串:
C语言分解三位数
//今天学的三位数分解include”stdio.h”int main() { int a,b,c,x; int i=1; while(1) { printf(“请输入第%d个三位数;”,i); printf(“\n”); scanf(“%d”,&x); a=x/100; b=(x%100)/10;
[C 语言]将一字符串分割,并将结果保存到数组里面 separate_string_to_array
/* 定义函数:char * strdup(const char *s); 函数说明:strdup()会先用maolloc()配置与参数s 字符串相同的空间大小,然后将参数s 字符串的内容复制到该内存地址,然后把该地址返回。 该地址最后可以利用free()来释放。 返回值:返回一字符串指针,该指针指向复制后的新字符串地址。若返回NULL 表示内存不足。 #include <str
日期字符串分解成年月日整型实现
包括验证输入日期格式是否正确,判断输入日期是否正确,判断日期是否合法,类型转换函数等函数
字符串乘积
Given two non-negative integers num1 and num2 represented as strings, return the product of num1 and num2.Note: The length of both num1 and num2 is &amp;lt; 110.Both num1 and num2 contains only digits 0-9...
OJ.2012: C语言实验——整数位
问题及代码: /* 2012: C语言实验——整数位 题目描述 输入一个不多于5位的正整数,要求: (1)求出它是几位数; (2)分别输出每一位数字; (3)按逆序输出各位数字。 输入 输入一个不多于5位的正整数。 输出 输出数据有3行,第一行为正整数位数,第二行为各位数字,第三行为逆序的各位数字。 样例输入 123 样例输出 3 1 2 3 3 2 1 作者:景怡乐 完成时间:2017年4月1
用C语言编写程序来分解用户录入的ISBN信息
用C语言编写一个程序来分解用户录入的ISBN信息
将String中的字符串分解成单个的单词
public class StringTest { /** * 实现将String中的数据以某种方式分离开来 * 我们用单个的字符串分离成单个的单词为例子 */ public static void main(String[] args) { String conent ="I Love java very much!"; //方法一: 直接调用spit方法
素数分解定理
对于一个大于1的数n,存在唯一的一组素数,他们的乘积为n。