0
点赞
收藏
分享

微信扫一扫

【C语言基础】:操作符详解(一)

小桥流水2016 02-28 09:00 阅读 3

目录

前言

1. 字符分类函数 

例:字母大小分类

例:字母大小写转换

字符串相关函数

strlen的函数使用和模拟实现

strlen的函数使用

strlen的模拟实现

法1

法2

法3:递归

strcpy的函数使用和模拟实现

strcpy的函数使用

strcpy的模拟实现

不返回

优化

返回目标空间的起始地址

strcat的函数使用和模拟实现

strcat的函数使用

strcat的模拟实现

strcmp的函数使用和模拟实现

strcmp的函数使用

 strcmp的模拟实现


1. 字符分类函数 

 C语⾔中有⼀系列的函数是专⻔做字符分类的,使⽤这些函数需要包含的头⽂件是 ctype.h

例:字母大小分类

例:字母大小写转换

字符串相关函数

字符串相关函数要包含头文件string.h

strlen的函数使用和模拟实现

strlen的函数使用

用于计算字符串的个数

  • strlen函数返回的是在字符串中 '\0' 前⾯出现的字符个数(不包 含 '\0' )。
  • 参数指向的字符串必须要以 '\0' 结束。
  • 注意函数的返回值为size_t,是⽆符号的

strlen的模拟实现

法1
#include<stdio.h>
#include<assert.h>
size_t my_strlen(const char*str)
{
	size_t count = 0;
	//断言str不为空指针
	assert(str != NULL);
	while (*str)
	{
		count++;
		str++;
	}
	return count;
}

int main()
{
	char arr[] = "abcdef";
	size_t len = my_strlen(arr);
	printf("%zd\n", len);
	return 0;
}
法2
#include<stdio.h>
#include<assert.h>

//strlen的模拟实现
size_t my_strlen2(char* str)
{
	assert(str != NULL);
	char* start = str;
	while (*str)
	{
		str++;
	}
	return str - start;
}
法3:递归
size_t my_strlen3(char* str)
{
	assert(str != NULL);
	if (*str)
	{
		return 1+my_strlen3(str+1);
	}
	else
	{
		return 0;
	}
}

strcpy的函数使用和模拟实现

strcpy的函数使用

用于拷贝字符串

  •  源字符串必须以 '\0' 结束。
  •  会将源字符串中的 '\0' 拷⻉到⽬标空间
  • ⽬标空间必须⾜够⼤,以确保能存放源字符串。
  • ⽬标空间必须可修改

strcpy的模拟实现

不返回
#include<stdio.h>
void my_strcpy(char* dest, const char* src)
{
	while (*src)//遇到\0就停下,跳出while循环
	{
        assert(dest != NULL);
	    assert(src != NULL);
		//一个个字节从头开始拷贝
		*dest = *src;
		dest++;
		src++;
	}
	*dest = *src;//最后把\0拷贝过去
}
int main()
{
	char arr1[20] = "xxxxxxxxxxx";
	char arr2[] = "hello";
	my_strcpy(arr1, arr2);
	printf("%s\n", arr1);
	return 0;
}
优化
#include<stdio.h>
//优化
void my_strcpy(char* dest, const char* src)
{
    //若有一个为空指针,assert即为假
    assert(dest &&src);
	//先赋值(拷贝)地址再++
	//最后\0拷贝过去后,整个表达式为0,跳出循环
	while (*dest++=*src++)
	{
		;//空语句
	}
}
返回目标空间的起始地址
char* my_strcpy(char* dest, const char* src)
{
	assert(dest && src);//若有一个为空指针,assert即为假
	//先赋值(拷贝)地址再++
	//最后\0拷贝过去后,整个表达式为0,跳出循环
	char* ret = dest;//保留目标空间的起始位置
	while (*dest++=*src++)
	{
		;//空语句
	}
	return ret;
}

strcat的函数使用和模拟实现

strcat的函数使用

用于追加字符串

  • 源字符串必须以 '\0' 结束。
  • ⽬标字符串中也得有 \0 ,否则没办法知道追加从哪⾥开始。
  • ⽬标空间必须有⾜够的⼤,能容纳下源字符串的内容。
  • ⽬标空间必须可修改。

strcat的模拟实现

注意:以下实现的my_strcat函数不可以自我追加,\0会被覆盖,造成死循环(越界访问)

#include<stdio.h>
#include<assert.h>
void my_strcat(char* dest, const char* src)
{
	assert(dest && src);
	//保留目标空间的起始位置
	char* ret = dest;
	//1.找到目标空间的\0
	while (*dest)
	{
		dest++;
	}
	//2.在dest后面拷贝src的内容
	while (*dest++ = *src++)
	{
		;
	}
 }
int main()
{
	char arr1[20] = "hello ";
	char arr2[] = "world";
	my_strcat(arr1, arr2);
	printf("%s\n", arr1);
	return 0;
}

strcmp的函数使用和模拟实现

strcmp的函数使用

用于字符串比较,⽐较两个字符串中对应位置上字符ASCII码值的⼤⼩,(不是比长度)

第⼀个字符串⼤于第⼆个字符串,则返回⼤于0的数字

第⼀个字符串等于第⼆个字符串,则返回0

第⼀个字符串⼩于第⼆个字符串,则返回⼩于0的数字

 strcmp的模拟实现

#include<stdio.h>
int my_strcmp(const char* s1, const char* s2)
{
	while (*s1 == *s2)
	{
		if (*s1 == '\0')
			return 0;
		s1++;
		s2++;
	}
	//return *s1-s2;
	if (*s1 > *s2)
		return 1;
	else
		return -1;
}

int main()
{
	int ret = my_strcmp("abcdefg", "abcdefg");
	printf("%d\n", ret);
	return 0;
}

举报

相关推荐

0 条评论