zoukankan      html  css  js  c++  java
  • 【通过操作指针,与指针做函数參数'实现字串在主串中出现的次数,然后将出现的部分依照要求进行替换 】

    #include<stdio.h>
    #include<stdlib.h>
    int strTime(const char *str1, const char *str2, int *time)
    {
    	int count = 0;
    	char *p1 = str1;
    	char *p2 = str2;
    	//p1是第一次出现的位置
    	p1 = strstr(p1, p2);
    	//注意这里不要写成*p1!=NULL 由于p1 是null的地址一旦读取*p1 会出错的!!!!不能读取操作系统的数据
    	//千万不要写成 *p
    	//while (*p1 != '')
    	//while (p1 != NULL)
    	while (p1)
    	{
    		count++;
    		//让指针向后移动str2长度个位置
    		p1 = p1+strlen(str2);
    		//找到下一次出现的位置
    		p1 = strstr(p1, p2);
    	}
    	*time = count;
    	return 1;
    }
    //这里也能够实现出现次数的查询
     /*int strTime(const char *str1, const char *str2, int *time)
    {
    	char *p = NULL;
    	int count = 0;
    	char *sub = NULL;
    	p = str1;
    	sub = str2;
    	do
    	{
    		p = strstr(p, sub);
    		if (p != NULL)
    		{
    			count++;
    			p = p + strlen(sub);
    		}
    		else
    		{
    			break;
    		}
    	} while (*p != '');
    	*time = count;
    }*/
    
    
     int getRes2(const char *str, const char *substr, int *time, char **buf2)
     {
    	 char *buf = (char *)malloc(strlen(str)*sizeof(char));
    	 char *pbuf = buf;
    	 //进行字符串的替换
    	 char *p = NULL;
    	 char *sub = NULL;
    	 p = str;
    	 sub = substr;
    	 int flag = 4;
    	 //仅仅要是不相等的情况下就将字符复制到buf中
    	 char *point = "dcba";
    	 while (*p != '')
    	 {
    		 if (*p != *sub)
    		 {
    			 *buf = *p;
    			 buf++;
    			 p++;
    			 //printf("%s
    ", pbuf);
    		 }
    		 //想等情况下也就是找到了须要替换的位置
    		 else
    		 {
    			 for (int i = 0; i < flag; i++)
    			 {
    				 *buf = *point;
    				 buf++;
    				 point++;
    				// printf("%s
    ", pbuf);
    			 }
    			 //控制4321循环
    			 flag--;
    			 //这里须要将离开了"dcba"首地址的指针又一次定位回去
    			 point = "dcba";
    			 if (flag == 0)
    			 {
    				 flag = 4;
    			 }
    			 //相等的时候须要让p指针跨越四个字节也就是他下一次进行查找的位置
    			 p += 4;
    		 }
    	 }
             //对末尾的加上字符串结束标志防止输出时乱码
             *buf = '';
             //二级指针的典型使用方法
             *buf2 = pbuf;
    }
    void main()
    {
        char *str1 = "abcd11111abcd2222abcdqqqqqabcd11111abcd2222abcdqqqqqabcd11111abcd2222abcdqqqqq";
    	char *str2 = "abcd";
    	
    	int time = 0;
    	//1求字符串"abcd"出现的次数
    	strTime(str1, str2, &time);
    	printf("出现的次数是%d
    ", time);
    	char *buf = NULL;
    	//把字符串替换成(dcba11111dcb2222dqqqqqdd11111dcba.....)
    	//注意特点逆序后,每次字符少一个,四次一循环;
    	getRes2(str1, str2, &time, &buf);
    	printf("原来的字符串   %s
    ", str1);
    	printf("替换后的字符串 %s
    ", buf);
    	system("pause");
    }

  • 相关阅读:
    2018/01/01Java基础学习——如何通过dos系统的javadoc命令生成API文档
    Go语言的big包实现大整数运算
    HDU5100 Chessboard【组合数学】
    HDU5143 NPY and arithmetic progression【暴力】
    UVALive5402 UVA579 Clock Hands【水题】
    UVA11799 Horror Dash【求极值+水题】
    HDU1017 ZOJ1152 A Mathematical Curiosity【暴力】
    UVALive2536 POJ1248 HDU1015 ZOJ1403 Safecracker【密码+暴力】
    POJ1284 Primitive Roots【原根】
    UVA11340 Newspaper【输入流+map】
  • 原文地址:https://www.cnblogs.com/mengfanrong/p/4552731.html
Copyright © 2011-2022 走看看