30.字符串处理函数


#pragma 指令的作用是:用于指定计算机或操作系统特定的编译器功能。
#pragma warning(disable:4996) 在c文件开始处写上这句话,即告诉编译器忽略4996警告,strcpy,scanf等一些不安全的标准c库函数在vs中就可以使用了。

1.测字符串长度函数

  • 头文件:#include<string.h>
  • 函数定义:size_t strlen(const char* s);
  • 函数功能:计算字符指针s指向的字符串中字符的个数,不包括’\0’。
  • 返回值:字符串中字符的个数。
#include<stdio.h>
#include<string.h>
//#pragma warning(disable:4996)
int main()
{
	char str1[20] = "hello";
	char* str2="hello";
	printf("sizeof(str1)=%d\n", sizeof(str1));
	printf("sizeof(str2)=%d\n", sizeof(str2));

	printf("strlen(str1)=%d\n", strlen(str1));
	printf("strlen(str2)=%d\n", strlen(str2));
	return 0;
}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.字符串拷贝函数

  • 头文件:#include<string.h>

1.strcpy函数

  • 函数的声明:char* strcpy(char* dest,const char* src);
  • 函数的说明:拷贝src指向的字符串到dest指针指向的内存中,'\0’也会拷贝。
  • 函数的返回值:目的内存的地址。

注意:在使用此函数时,必须保证dest指向的内存空间足够大,否则会出现内存污染。

#include<stdio.h>
#include<string.h>
#pragma warning(disable:4996)
int main()
{
	char str[100] = "aaaaaaaaaaaaaaaaaaaaaaaa";
	strcpy(str, "hello");
	printf("str=%s\n", str);
	printf("str+6=%s\n", str+6);
	return 0;
}

在这里插入图片描述
在这里插入图片描述

2.strncpy函数

  • char* strncpy(char* dest, const char* src, size_t n);
  • 函数说明:将src指向的字符串前n个字节拷贝到dest指向的内存中。
  • 返回值:目的内存的首地址。

注意:

  • strncpy不拷贝’\0’。
  • 如果n大于src指向的字符串中的字符个数,则在dest后面填充n-strlen(src)个’\0’。
#include<stdio.h>
#include<string.h>
#pragma warning(disable:4996)
int main()
{
	char buf[100] = "aaaaaaaaaaaaaaaaaaaa";
	strncpy(buf, "hello", 5);
	printf("buf=%s\n", buf);
	return 0;
}

在这里插入图片描述

#include<stdio.h>
#include<string.h>
#pragma warning(disable:4996)
int main()
{
	char buf[100] = "aaaaaaaaaaaaaaaaaaaaaaaaaa";
	int len,i;
	len = strlen(buf);
	strncpy(buf, "helloworld", 15);
	printf("buf=%s\n", buf);
	for (i = 0; i < len; i++)
	{
		printf("buf[%d]=%c ",i,buf[i]);
		if (i % 5 == 0) {
			printf("\n");
		}
	}
	return 0;
}

在这里插入图片描述

3.字符串追加函数

  • 头文件:#include<string.h>

1.strcat函数

  • 函数声明:char* strcat(char* dest, const char* src);
  • 函数功能:strcat函数追加src字符串到dest指向的字符串后面。追加的时候会追加’\0’。
  • 注意:保证dest指向的内存空间足够大。
#include<stdio.h>
#include<string.h>
#pragma warning(disable:4996)
int main()
{
	char str[100] = "aa\0aaaaaaaaaaaaaaaaaaa";
	strcat(str, "hello");
	printf("str=%s\n", str);
	return 0;
}

在这里插入图片描述

2.strncat函数

  • char* strncat(char* dest, const char* src, size_t n);
  • 追加src指向的字符串的前n个字符,到dest指向的字符串后面。
  • 注意如果n大于src字符的个数,则只将字符串追加到dest指向的字符串后面。追加的时候会追加’\0’。
#include<stdio.h>
#include<string.h>
#pragma warning(disable:4996)
int main()
{
	char str[100] = "aa\0aaaaaaaaaaaaaaaaaaa";
	char* src = "hello";
	strncat(str,src,3);
	printf("str=%s\n", str);
	return 0;
}

在这里插入图片描述

#include<stdio.h>
#include<string.h>
#pragma warning(disable:4996)
int main()
{
	char str[100] = "aa\0aaaaaaaaaaaaaaaaaaa";
	char* src = "hello";
	strncat(str,src,15);
	printf("str=%s\n", str);
	printf("str+8=%s\n", str + 8);
	return 0;
}

在这里插入图片描述

4.字符串比较函数

头文件:#include<string.h>

1.strcmp函数

  • 函数声明:int strcmp(const char* s1, const char* s2);
  • 函数说明:比较s1和s2指向的字符串的大小。逐个字符比较ASCII 码,一旦比较出大小就返回。如果所有字符都一样,则返回0。
  • 返回值:如果s1指向的字符大于s2指向的字符,返回1。如果s1指向的字符小于s2指向的字符,返回-1 。如果相等返回0.
#include<stdio.h>
#include<string.h>
#pragma warning(disable:4996)
int main()
{
	char* str1 = "hello world";
	char* str2 = "hello worlda";
	int ret;
	ret = strcmp(str1, str2);
	if (ret > 0)
		printf("str1指向的字符串大于str2指向的字符串\n");
	else if(ret<0)
		printf("str1指向的字符串小于str2指向的字符串\n");
	else
		printf("两个字符串相等\n");
	printf("ret=%d\n", ret);
	return 0;
}

在这里插入图片描述

2.strncmp函数

  • int strncmp(const char* s1,const char* s2, size_t n);
  • 函数说明:比较s1和s2指向的字符串中前n个字符。
#include<stdio.h>
#include<string.h>
#pragma warning(disable:4996)
int main()
{
	char* str1 = "hello world";
	char* str2 = "hello kitty";
	int ret;
	ret = strncmp(str1, str2, 5);
	if (ret > 0)
		printf("str1的前5个字符大于str2的前5个字符\n");
	else if(ret < 0)
		printf("str1的前5个字符小于str2的前5个字符\n");
	else
		printf("两个字符串前5个字符相等\n");
}

在这里插入图片描述

5.字符查找函数

  • 头文件:#include<string.h>

1.strchr函数

  • 函数声明:char* strchr(const char* s, int c);
  • 函数说明:在字符指针s指向的字符串中,找ASCII码为c的字符。
  • 返回值:找到返回字符的地址。找不到返回NULL。

注意:是首次匹配,如果说s指向的字符串中有多个ASCII为c的字符,则找的是第一个字符的返回值。

#include<stdio.h>
#include<string.h>
#pragma warning(disable:4996)
int main()
{
	char* str = "helloworldhelloworldhelloworld";
	char* p;
	p = strchr(str, 'w');
	if (p == NULL)
	{
		printf("没有您要找的字符");
		return 0;
	}
	printf("p-str=%d\n", p - str);
	return 0;
}

在这里插入图片描述

2.strrchr函数

  • 函数声明:char* strrchr(const char* s,int c);
  • 函数说明:末次匹配。在s指向的字符串,找出最后一次出现的ASCII为c的字符。
  • 返回值:末次匹配的字符的地址。找不到返回NULL。
#include<stdio.h>
#include<string.h>
#pragma warning(disable:4996)
int main()
{
	char* str = "helloworldhelloworldhelloworld";
	char* p;
	p = strrchr(str, 'w');
	if (p == NULL)
	{
		printf("没有您要找的字符");
		return 0;
	}
	printf("p-str=%d\n", p - str);
	return 0;
}

在这里插入图片描述

6.字符串匹配函数

  • #include<string.h>
  • char* strstr(const char* haystack,const char* needle);
  • 函数说明:在haystack指向的字符串中查找needle指向的字符串,也是首次匹配。
  • 返回值:找到返回字符串的首地址,没找到返回NULL。
#include<stdio.h>
#include<string.h>
#pragma warning(disable:4996)
int main()
{
	char str1[100] = "dfjk$#$adjkwfha$#$dwadaf";
	char str2[100] = "$#$";
	char* p;
	p = strstr(str1, str2);
	if (p == NULL)
	{
		printf("没有您要查找的字符串\n");
		return 0;
	}
	printf("p-str1=%d\n", p - str1);
	return 0;
}

在这里插入图片描述

7.空间设定函数

头文件:#include<string.h>

  • 函数声明:void* memset(void* ptr, int value, size_t num);
  • 函数功能:memset函数是将ptr指向的内存空间的num个字节全部赋值为value。
  • 参数:ptr:指向任意类型的指针,即指向我们需要修改的内存。value:给ptr指向的内存空间赋的值。num:确定将ptr所指向的内存中的num个字节全部用value代替。
  • 返回值:目的内存的首地址,即ptr的值。
#include<stdio.h>
#include<string.h>
#pragma warning(disable:4996)
int main()
{
	char str[100] = "helloworld";
	memset(str, '\0', 100);
	printf("str=%s\n", str);
	memset(str, 'a', 5);
	printf("str=%s\n", str);
	return 0;
}

在这里插入图片描述

8.字符串转换数值

  • atoi/atol/atof //字符串转换功能
  • 头文件:#include<stdlib.h>
  • 函数的声明:int atoi(const char* nptr);
  • 函数的功能:将nptr指向的字符串转换成整型返回。
  • 返回值:转换后的整数,此值由将输入的字符作为数字解析而成。如果该输入无法转换成该类型的值,则返回值为0。
#include<stdio.h>
#include<stdlib.h>
#pragma warning(diable:4996)
int main()
{
	int num;
	num = atoi("123");
	printf("num=%d\n", num);
	num = atoi("abc");
	printf("num=%d\n", num);
	return 0;
}

在这里插入图片描述
long atol(const char* nptr);
double atof(const char* nptr);

9.字符串切割函数

  • 头文件:#include<string.h>
  • 函数声明:char* strtok(char* str,const char* delim);
  • 函数的功能:字符串切割,按照delim指向的字符串中的字符,切割str指向的字符串。其实就是在str指向的字符串中发现了delim字符串中的字符,就将其变成’\0’,调用一次strtok只切割一次,切割一次后,再去切割的时候strtok的第一个参数传NULL,意思是接着上次的切割位置继续切。

注意:如果str字符串中出现了连续几个delim中的字符,则只将第一个字符变成’\0’。

#include<stdio.h>
#include<string.h>
#pragma warning(disable:4996)
int main()
{
	char str[100] = "xiaoming:21,,,.男.女,北京:haidian";
	char* p[7];
	int i = 0,j;
	printf("str=%s\n", str);
	p[i] = strtok(str, ":,.");
	printf("p[%d]=%s\n", i, p[i]);
	printf("str=%s\n", str);
	while (p[i] != NULL) {
		i++;
		p[i] = strtok(NULL, ":,.");
	}
	for (j = 0; j < i; j++)
	{
		printf("p[%d]=%s\n", j, p[j]);
	}
	printf("p[1]+3=%s\n", p[1] + 3);
	return 0;
}

在这里插入图片描述

strtok函数练习

在这里插入图片描述

#include<stdio.h>
#include<string.h>
#pragma warning(disable:4996)
int msg_deal(char* msg_src, char* msg_done[], char* str)
{
	int i = 0;
	msg_done[i] = strtok(msg_src, str);
	while (msg_done[i] != NULL)
	{
		i++;
		msg_done[i] = strtok(NULL, str);
	}
	return i;
}
int main()
{
	char s[100] = "+CMGR:REC UNREAD,+8613466630259,98/10/01,18:22:11+00,ABCdefGHI";
	char* p[6];
	int num,i;
	num = msg_deal(s, p, ",");
	printf("num=%d\n", num);
	for (i = 0; i < num; i++)
	{
		printf("p[%d]=%s\n",i, p[i]);
	}
	printf("手机号:%s\n", p[1] + 3);
	printf("日期:%s\n", p[2]);
	*(p[3] + 8) = '\0';
	printf("时间:%s\n", p[3]);
	printf("内容:%s\n", p[4]);
	return 0;
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

oo0day

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值