【C语言详解】3.字符函数与字符串函数

1.strlen函数(求字符串长度)

size_t strlen (const char * str );

(1)使用

#include <stdio.h>
#include<string>
int main()
{
	const char *str = "luckly";
	int len = strlen(str);
	printf("%d\n", len);
	return 0;
}
//5

(2)自行实现

法一:计数器

\0不算入长度内,所以可以定义一个count,遇到\0停止即可

#include <stdio.h>
#include<assert.h>
int Mystrlen(const char*str)
{
	assert(str != NULL);
	int count = 0;
	while(*str != '\0')
	{
		count++;
		str++;
	}
	return count;
}
int main()
{
	const char *str = "luckly";
	int len = Mystrlen(str);
	printf("%d\n", len);
	return 0;
}

法二:通过指针

unsigned int Mystrlen(const char*str)
{
	assert(str != NULL);
	const char *p = str;
	while (*p != '\0')
	{
		*p++;
	}
	return p - str;//用无符号接收,以免算出来为负
}
int main()
{
	const char *str = "luckly";
	unsigned int len = Mystrlen(str);
	printf("%u\n", len);
	return 0;
}

2.strcpy函数(拷贝)

char* strcpy(char *destination,const char *source);

(1)使用

#include<string.h>
int main()
{
	char *str1 = "abcde";
	char str2[10] = "hello";
	char *ret = strcpy(str2, str1);
	printf("%s", ret);
	return 0;
}

(2)自行实现

#include <stdio.h>
#include<assert.h>
#include<string.h>
char*MyStrcpy(char * dest, const char * str)
{
	char *p = dest;
	assert(dest != 0 && str != 0);
	while (*str != '\0')
	{
		*dest = *str;
		dest++;
		str++;
	}
	*dest = '\0';
	return p;
}
int main()
{
	char * str1 = "abcdef";
	char str2[10] = "hello";//注意!!一定为数组啊
   char *ret= MyStrcpy(str2, str1);
	printf("%s", ret);
	return 0;
}

简化版:

char*MyStrcpy(char * dest, const char * str)
{
	char *p = dest;
	assert(dest && str);//即dest != 0 && str != 0
	while (*dest++ = *str++);//\0=\0,为0,为假,循环结束
	return p;
}
int main()
{
	char * str1 = "abcdef";
	char str2[10] = "hello";//注意!!一定为数组啊
	char *ret = MyStrcpy(str2, str1);//有返回值为了之后求长度之类
	printf("%s\n", ret);
	printf("%s\n", str2);
	printf("%d\n", strlen(MyStrcpy(str2, str1)));
	printf("%d\n", strlen( ret));
	return 0;
}

3.strcat字符串拼接

(1)使用

int main()
{
	char * str1 = "abcdef";
	char str2[20] = "hello";//注意!!一定为数组啊
	/*char *ret= strcat(str2, str1);
	printf("%s|n", ret);
	printf("%s\n", str2);*/
	printf("%d\n", strlen(strcat(str2, str1)));

	return 0;
}

(2)自行实现

先让str1走到\0,再把str2赋给\0开始,最后返回初始位置

#include <stdio.h>
#include<assert.h>
#include<string.h>
char * MyStrcat(char * dest, const char * str)
{
	assert(dest&&str);
	char *p = dest;
	while (*dest != '\0')
	{
		*dest++;
	}
	//*dest=\0;
	while (*dest++ = *str++)
          ;//空语句
		return p;
}
int main()
{
	char * str1 = "abcdef";
	char str2[20] = "hello";
	char *ret = MyStrcat(str2, str1);
	printf("%s\n", ret);
	return 0;
}

4.strcmp字符串比较

int strcmp(const char*str1,const char*str2)

第一个字符串大于第二个字符串,返回大于0的数字;  1

第一个字符串相等第二个字符串,返回0;

第一个字符串小于第二个字符串,返回小于0的数字;  -1

(遇到第一个不同的就开始比较)

(1)使用

int main()
{
	char*str1 = "abcde";
	char*str2 = "abgde";
	int ret = strcmp(str1, str2);//用 int
	printf("%d\n", ret);// -1
	return 0;
}

(2)自行实现

#include <stdio.h>
#include<assert.h>
#include<string.h>
int MyStrcmp(const char*dest, const char*src)
{
	assert(dest&&src);
	while (*dest == *src)
	{
		if (*src == '\0')
		{
			return 0;
		}
		*dest++;
		*src++;
	}
	if (*dest > *src)
	{
		return 1;
	}
	else
	{
		return -1;
	}
}
int main()
{
	char*str1 = "abgde";
	char*str2 = "abcde";
	int ret = MyStrcmp(str1, str2);
	printf("%d\n", ret);
	return 0;
}

5.strncpy拷贝n个字符

int main()
{
	char*str1 = "abcde";
	char str2[10] = { 0 };
	char * ret = strncpy(str2, str1,3);
	printf("%s\n", ret);  //打印abc
	return 0;
}

6.strncat拼接n个字符

int main()
{
	char*str1 = "abcde";
	char str2[10] = "hello";
	char * ret = strncat(str2, str1,3);
	printf("%s\n", ret);
	return 0;
}

7.strncmp比较前n个

int main()
{
	char*str1 = "abcde";
	char *str2 = "anllo";
	int ret=strcmp(str1, str2,2);
	printf("%d\n", ret);
	return 0;
}

8.strstr查找子串在主串中的位置

char * strstr(const  char *,const char *);

(1)使用

int main()
{
	char * str1 = "ababcabcde";
	char * str2 = "abc";
	char * ret = strstr(str1, str2);
	printf("%s\n", ret);
	return 0;
}

(2)自行实现

#include <stdio.h>
#include<assert.h>
#include<string.h>
const char * Mystrstr(const char *str1, const char*str2)
{
	assert(str1 != NULL&&str2 != NULL);
	while (*str1 != '\0')
	{
		const char *s1 = str1;
		const char *s2 = str2;
		while (*s1 == *s2&&*s1 != '\0'&& *s2 != '\0')
		{
			s1++;
			s2++;
		}
		if (*s2 == '\0')
		{
			return str1;
		}
		str1++;
	}
	return NULL;
}
int main()
{
	const char * str1 = "ababcabcde";
	const char * str2 = "abc";
	const char * ret = strstr(str1, str2);
	printf("%s\n", ret);
	return 0;
}
//类似算法还有:KMP,朴素算法BF

9.memcpy内存拷贝函数

void * memcpy (void *destinnation,const void *source,size_t num)

  • 源空间和目标空间可能会有重叠,最好少使用(因此使用memmove函数处理
第一种:
int main()
{
	int arr1[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
	int arr2[10] = {0};
	int *p = (int*)memcpy(arr2, arr1, 10 * sizeof(int));
	for (int i = 0; i < 10; i++)
	{
		printf("%d ", p[i]);
	}
	return 0;
}

第二种:
int main()
{
	int arr1[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
	int arr2[10] = {0};
    memcpy(arr1+2, arr1, 4 * sizeof(int));
	for (int i = 0; i < 10; i++)
	{
		printf("%d ", arr1[i]);
	}
	return 0;
}

10.memmove

int main()
{
	int arr1[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
	int arr2[10] = {0};
    memmove(arr1+2, arr1, 4 * sizeof(int));
	for (int i = 0; i < 10; i++)
	{
		printf("%d ", arr1[i]);
	}
	return 0;
}

11.memcmp内存比较

和strcmp很类似

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
自动控制节水灌溉技术的高低代表着农业现代化的发展状况,灌溉系统自动化水平较低是制约我国高效农业发展的主要原因。本文就此问题研究了单片机控制的滴灌节水灌溉系统,该系统可对不同土壤的湿度进行监控,并按照作物对土壤湿度的要求进行适时、适量灌水,其核心是单片机和PC机构成的控制部分,主要对土壤湿度与灌水量之间的关系、灌溉控制技术及设备系统的硬件、软件编程各个部分进行了深入的研究。 单片机控制部分采用上下位机的形式。下位机硬件部分选用AT89C51单片机为核心,主要由土壤湿度传感器,信号处理电路,显示电路,输出控制电路,故障报警电路等组成,软件选用汇编语言编程。上位机选用586型以上PC机,通过MAX232芯片实现同下位机的电平转换功能,上下位机之间通过串行通信方式进行数据的双向传输,软件选用VB高级编程语言以建立友好的人机界面。系统主要具有以下功能:可在PC机提供的人机对话界面上设置作物要求的土壤湿度相关参数;单片机可将土壤湿度传感器检测到的土壤湿度模拟量转换成数字量,显示于LED显示器上,同时单片机可采用串行通信方式将此湿度值传输到PC机上;PC机通过其内设程序计算出所需的灌水量和灌水时间,且显示于界面上,并将有关的灌水信息反馈给单片机,若需灌水,则单片机系统启动鸣音报警,发出灌水信号,并经放大驱动设备,开启电磁阀进行倒计时定时灌水,若不需灌水,即PC机上显示的灌水量和灌水时间均为0,系统不进行灌水。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值