通过操作指针,与指针做函数参数'实现字串在主串中出现的次数,然后将出现的部分按照要求进行替换

#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 != ‘\0‘)
	//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 != ‘\0‘);
	*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 != ‘\0‘)
	 {
		 if (*p != *sub)
		 {
			 *buf = *p;
			 buf++;
			 p++;
			 //printf("%s\n", pbuf);
		 }
		 //想等情况下也就是找到了需要替换的位置
		 else
		 {
			 for (int i = 0; i < flag; i++)
			 {
				 *buf = *point;
				 buf++;
				 point++;
				// printf("%s\n", pbuf);
			 }
			 //控制4321循环
			 flag--;
			 //这里需要将离开了"dcba"首地址的指针重新定位回去
			 point = "dcba";
			 if (flag == 0)
			 {
				 flag = 4;
			 }
			 //相等的时候需要让p指针跨越四个字节也就是他下一次进行查找的位置
			 p += 4;
		 }
	 }
         //对末尾的加上字符串结束标志防止输出时乱码
         *buf = ‘\0‘;
         //二级指针的典型用法
         *buf2 = pbuf;
}
void main()
{
    char *str1 = "abcd11111abcd2222abcdqqqqqabcd11111abcd2222abcdqqqqqabcd11111abcd2222abcdqqqqq";
	char *str2 = "abcd";

	int time = 0;
	//1求字符串"abcd"出现的次数
	strTime(str1, str2, &time);
	printf("出现的次数是%d\n", time);
	char *buf = NULL;
	//把字符串替换成(dcba11111dcb2222dqqqqqdd11111dcba.....)
	//注意特点逆序后,每次字符少一个,四次一循环;
	getRes2(str1, str2, &time, &buf);
	printf("原来的字符串   %s\n", str1);
	printf("替换后的字符串 %s\n", buf);
	system("pause");
}

通过操作指针,与指针做函数参数'实现字串在主串中出现的次数,然后将出现的部分按照要求进行替换

时间: 05-13

通过操作指针,与指针做函数参数'实现字串在主串中出现的次数,然后将出现的部分按照要求进行替换的相关文章

用指针做函数参数的好处,

用指针做函数参数的好处, 首先要理解函数传参的过程,函数传参是复制型的,例如 void modify(int a) { a++; } void main() { int a=5; modify(a); printf("%d",a); } 程序执行完之后,a的值还是5,为什么呢,因为在执行modify函数的时候,是另外开辟了存储空间,将a的值复制过去,然后modify函数所进行的所有操作都是针对这个新开辟的空间而言的,因此程序执行完之后,a的值并没有发生改变, 如果我们用指针去传递参数,

c语言数组做函数参数退化为指针

我的系统是MAC OS 64位.根据自己的系统位数不同是有差异的.以下是我学习过程中遇到的问题 大侠略过... 有时候我们想通过一个函数对数组的元素进行操作,在sizelen函数中想想通过sizeof获得数组的长度. 想法是好的,不要以为你对C语言很了解了.其实数组在做函数参数是只是传了,一个指针.也就是数组 的首地址. 从结果可以看出,C编译器确实是这么做得.我的系统是64位,所以int *是占8个字节. 以上只是我学习过程中遇到的问题.大侠略过...

【通过操作指针,与指针做函数參数&amp;#39;实现字串在主串中出现的次数,然后将出现的部分依照要求进行替换 】

#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 会出错的!!!!不能读取操作系统的数据

Day8 函数指针做函数参数

课堂笔记 课程回顾 多态 virtual关键字 纯虚函数 virtual func() = 0; 提前布局vptr指针 面向接口编程 延迟绑定 多态的析构函数的虚函数. 多继承的二义性 . 重载 重写 重定义. 实现多态的理论基础:函数指针做函数参数. vptr指针与虚函数表. 构造函数不应为虚函数 多态会降低程序的执行速度.不建议所有的函数都是虚函数. 多态时的指针步进. 多继承在项目开发中使用的比较少. linux从2.4内核升级到2.6的时候,做到了电源可以热插拔,提前将电源驱动的接口规划

C++基础8【难】 回顾:数组指针,函数指针,函数指针做函数参数 C语言多态

1,数组指针语法梳理 回顾,如何定义数组数据类型: 回顾,如何定义指针类型数组: 回顾,如何直接定义 一个指向数组类型的指针: 2,函数指针语法梳理 1)如何定义一个函数类型 2)如何定义一个函数指针类型 3)如何定义一个函数指针(指向一个函数的入口地址) [中级程序员 转 高级程序员的 必经之路] 1,函数类型做函数的参数 把函数的入口地址传过来,奇怪的效果:[多态就是这样] 函数指针 做 函数参数 思想剖析 1,数组指针语法梳理 回顾,如何定义数组数据类型: [email protected

实参和形参指针做函数参数时,如何改变main函数变量的值

//对输入的两个整数按大小顺序输出 代码如下: #include<iostream> using namespace std; int main() { void swap(int *p1,int *p2); int *pointer_1,*pointer_2,a,b; cin>>a>>b; pointer_1=&a; pointer_2=&b; if(a<b)swap(pointer_1,pointer_2); cout<<"

C语言 数组做函数参数退化为指针的技术推演

//数组做函数参数退化为指针的技术推演 #include<stdio.h> #include<stdlib.h> #include<string.h> //一维数组做函数参数退化为指针的技术推演 void printfA(char * strarr[3]); //计算机中,数组都是线性存储,二维数组元素也是一个个的排列的 //例如: 1,2,3,4,5,6,7,8,9 像这组数据 我们可以认为是一维数组 int a[9]={1,2,3,4,5,6,7,8,9}; //也

二维数组做函数参数、指向指针的指针做函数参数

这里有一篇文章  写的很好http://blog.csdn.net/f81892461/article/details/8974087 该文章中有一句话  总之就是:数组无法作为参数,总会被编译器将地址赋值给形参指针的,即使指针定义成数组形式,也还是指针.然后各种差别都是由数组和指针不同的定位元素的方式导致的. 这句话说的很对啊,数组做形参的是时候都是被当成指针来处理的.不明白这句话的可以看一下,参考文章链接里的那幅图,注意比较一下下图中的两个:data+1,第一个data+1指向的是元素dat

const 小结: 做函数参数,做函数返回值,以及const函数

做函数参数 : 例如 fun(const int * i)参数i的值不能在fun()函数执行的过程中被修改,它将一直保持调用此函数时传入的值.如果试图修改i值的语句在fun()函数中出现,将导致程序无法编译,这样对参数i起到保护作用. 注:const 通常用来限制函数的指针参数,引用和数组参数,而一般形式的参数因为形参和实参本不是同一内存单元的变量,所以对形参的修改不会影响实参,因此也没有必要限制函数体不能对参数进行修改.  做函数返回值 : 函数返回值为 const 只有用在函数返回为引用的情