指针和字符串内容1

指针和字符串内容1

原文链接(点击原文链接获取更多学习干货):
http://blog.bools.cn/archives/1058
指针和字符串

char*p="hello world"

p[2]='m';

//程序会报错,指针类型的字符串属于数据区常量区字符串,不允许修改

char ch[]="hello world";

ch[2]='m';

//程序不报错,这属于栈区字符串,可修改

所以一般情况下直接用数组得形式去写字符串

字符串数组

定义形式:

一、

//这种定义形式可修改值

char ch1[]="hello";

char ch2[]="world";

char*arr[]={ch1,ch2};

//这种定义形式不可修改值

char* arr[]={"hello","world"};


指针作为函数返回值

指针作为函数返回值的时候,则允许返回的是一个地址。

字符串查找字符:

#include<stdio.h>
char* my_strct(char* str, char ch)
{
	int i = 0;
	while (str)
	{
		if (str [i]== ch)
		{
			return &str[i];//返回的值则作为数组里面的首地址,那么将会打印出其后面的全部元素,知道遇到\0
		}
		i++;
	}
	return NULL;
}

int main(void)

{
	char str[] = "hello world";
	char* p = my_strct(str, 'l');
	if (p == NULL)
		printf("找不到");
	else
		printf("%s\n", p);
	return 0;
}

//以上代码实现的是利用指针作为返回值,查找字符,然后将对应元素作为新的首地址,然后输出数组里面剩余的字符。
注意:

return &str[i];中str[i]是数组的形式,而返回值是指针类型,所以必须加一个&指向它的地址,或者改成return str;

字符串中查找字符串出现位置

  #include<stdio.h>
char* my_strstr(char* src, char* dest)
{
	char* fsrc = src;//用于循环遍历原字符串指针
	char* rsrc = src;//记录相同首地址和用于回滚地址
	char* fdest = dest;
	while (*fsrc)
	{
		rsrc = fsrc;
		while (*fsrc==*fdest && *fsrc!='\0')
		{
			fsrc++;
			fdest++;
			

		}
		if (*fdest == '\0')
		{
			return rsrc;
		}
		fsrc = rsrc;
		fdest = dest;
		fsrc++;


	}
	return NULL;

}
int main()
{
	char src[] = "hello world";
	char dest[] = "llo";
	char* p = my_strstr(src, dest);
	printf("%s\n", p);
	return 0;



}

注意:

1、要另外设立指针去遍历原字符串数组和目标数组,

2、rsrc记录的是每次遍历循环开始时候的地址,当进入了判断fsrcfdest退出来的时候,fsrc回滚的地址是fsrcfdest时候的地址。

3、指针不带*则表示的是地址,所以可以直接return rsrc;

字符串出现次数

#include<stdio.h>
#include<string.h>
#define _CRT_SECURE_NO_WARINGS
char* my_strstr(char* src, char* dest)
{
	char* fsrc = src;//用于循环遍历原字符串指针
	char* rsrc = src;//记录相同首地址和用于回滚地址
	char* fdest = dest;
	while (*fsrc)
	{
		rsrc = fsrc;
		while (*fsrc == *fdest && *fsrc != '\0')
		{
			fsrc++;
			fdest++;


		}
		if (*fdest == '\0')
		{
			return rsrc;
		}
		fsrc = rsrc;
		fdest = dest;
		fsrc++;


	}
	return NULL;

}
int main()
{
	char src[] = "11abcd8994545abcd565941abcd59894196abcd";
	char dest[] = "abcd";
	char* p = my_strstr(src, dest);
	int count = 0;
	while (p != NULL)
	{
		count++;
		p += strlen(dest);
		p = my_strstr(src, p);
	}
	printf("abcd出现次数:%d次\n", count);
	return 0;

}

注意:

1、代码和在字符串中查找字符串相同,不同的是添加了一个while循环

。同时引进了一个strlen()函数(注意添加string.h的头文件)。

字符串去空格

利用的是 指针逐次指向字符串数组,将不等于空格的元素存放到另一个指针里面

#include<stdio.h>
void remove_space(char* ch)
{
	char* rtemp = ch;
	char* ftemp = ch;
	while (*ftemp)
	{
		if (*ftemp != ' ')
		{
			*rtemp = *ftemp;
			rtemp++;
		}
		ftemp++;//指针偏移记得不要加*
	}
	*ftemp = 0;
}
int main(void)

{
	char ch[100] = "h   e  l  l  o ";
	remove_space(ch);
	printf("%s\n", ch);
	return 0;

}

字符指针作为函数参数

计算字符串有效长度(利用指针)

#include<stdio.h>
int my_strlen(char* ch)
{
	char* temp = ch;
	while (*temp)temp++;
	return temp - ch;//尾地址减去首地址得到它的长度
}

int main(void)

{
	char str[] = "hello world";
	int p=my_strlen(str);
	printf("%d", p);
	return 0;
}

欢迎关注技术公众号,获取更多硬件学习干货!
在这里插入图片描述

我们能为你提供什么?
技术辅导:C++、Java、嵌入式软件/硬件
项目辅导:软件/硬件项目、大厂实训项目
就业辅导:就业全流程辅导、技术创业支持
对接企业HR:培养输送优质性人才

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值