栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

手把手教学:字符函数的介绍及其模拟实现《看完准会使用》

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

手把手教学:字符函数的介绍及其模拟实现《看完准会使用》

字符函数的介绍及其模拟实现
  • 1.求字符串长度函数
    • strlen的用法和模拟实现
  • 2.长度不受限制的字符串函数
    • strcpy
    • strcat
    • strcmp
  • 3.简单介绍长度受限制的字符串函数
    • strncpy
    • strncat
    • strncmp
  • 4.字符串查找函数
    • strstr
    • strtok
  • 5.错误信息报告函数
    • strerror

1.求字符串长度函数 strlen的用法和模拟实现

strlen()函数该函数从第一个字符开始计算字符串中字符数,直到遇到空字符即’’为止,然后返回计算字符数的长度,包括’’。

接下来我们利用MSDN 来查看一下strlen函数的实际应用方法:

注意:由上面我们可以知道strlen函数的返回类型:size_t(无符号整型)

具体用法:接下来我们来尝试一下实现一个简单的strlen函数:
头文件:#include “string.h”

#include
#include

int  main()
{
	char arr[] = "abccd";
	printf("%d", strlen(arr));
	return 0;
}


知道了strlen函数的用法和原理之后,我们自己也来尝试做一个和strlen函数具有一样用途的函数。
模拟实现如下

#include
#include
#include
size_t my_str(char* arr)
{
	int count = 0;
	assert(arr != NULL);
	while (*arr++)
	{
		count++;
	}
	return count;
}

int main()
{
	char arr[] = { "aabcdefwcng" };
	
	int num = my_str(arr);
	printf("%dn", num);
	return 0;
}

2.长度不受限制的字符串函数 strcpy


具体用法
头文件:#include “string.h”

#include
#pragma warning(disable:4996) 
#include 
int  main()
{
	char a[20], c[] = "I am a student!";
	strcpy(a, c);
	printf(" c=%sn", c);
	printf(" a=%sn", a);
	return 0;
}


知道了strcpy函数的用法和原理之后,我们自己也来尝试做一个和strcpy函数具有一样用途的函数。
模拟实现如下

#include
#include
void my_strcpy(char* dest, const char* src)

{
	assert(src != NULL);
	assert(dest != NULL);
	
	while (*dest++ = *src++)
	{
		;
	}
}
int main()
{

	char arr1[] = "abcdef";
	char arr2[10] = "xxxxxxxxxxx";
     my_strcpy(arr2, arr1);
	printf("%sn", arr2);

	return 0;
}


注意:
1.源字符串必须以 ‘’ 结束。
2.会将源字符串中的 ‘’ 拷贝到目标空间。
3.目标空间必须足够大,以确保能存放源字符串。
4.目标空间必须可变

strcat

对于strcat函数,其实就是把又一个字符串加在了前一个字符串的后面,用的时候注意被加入的空间要足够大,不能追加之后就溢出;

从MSDN上我们可以看出来strcat和strcpy的使用方法非常类似,它们都具有同样的参数布局方式和返回类型
具体用法
头文件:#include “string.h”

#include
#include
#pragma warning(disable:4996) 

int main()
{

	char a[30] = "zhoumin is ";
    char b[] = "a good girl!";

	printf("%s",strcat(a, b));
	return 0;
}
	


知道了strcat函数的用法和原理之后,我们自己也来尝试做一个和strcat函数具有一样用途的函数。
模拟实现如下

#include 
#include 

char* MyStrcat(char* dest, const char* src)
{
	char* ret = dest;
	assert(dest != NULL);
	assert(src != NULL);
	while (*dest)
	{
		dest++;
	}
	while ((*dest++ = *src++))
	{
		;
	}
	return ret;
}

int main()
{
	char str[20] = "Hello";
	printf("%sn", MyStrcat(str, " my girl"));
	return 0;
}


注意:
1.源字符串必须以 ‘’ 结束。
2.目标空间必须有足够的大,能容纳下源字符串的内容。
3.目标空间必须可修改。

strcmp

作用:比较a,b两个字符串,strcmp函数是根据ASCII码来比较两个字符串的。用a字符串的第一个字符减去b字符串的第一个字符,若第一个字符相等,则对比第二个字符,若a,b完全相等,则返回0,继续比较后面的字符大小;若a大于b,则返回大于0的数值;若a小于b,同样返回小于0的数值

具体用法
头文件:#include “string.h”

#include
#include
int main() {
	const char* str1 = "abcd";
	const char* str2 = "abdc";
	int xx = strcmp(str1, str2);
	printf("%d", xx);
	return 0;
}


知道了strcmp函数的用法和原理之后,我们自己也来尝试做一个和strcmp函数具有一样用途的函数。
模拟实现如下

#include 
#include
#include
int my_strcmp(char* str1, char* str2)
{
	assert(str1);
	assert(str2);
	while (*str1 == *str2)
	{
		if (*str1 == '' || (*str2 = ''))
			return 0;
		str1++;
		str2++;
	}
	return *str1 - *str2;
}

int main()
{
	char str[32] = "bcdefg";
	char buf[32] = "bcdefg";
	char erc[32] = "abcdeg";
	char std[32] = "cdafgh";
	printf("%dn", my_strcmp(str, buf));
	printf("%dn", my_strcmp(str, erc));
	printf("%dn", my_strcmp(str, std));
	system("pause");
	return 0;
}

3.简单介绍长度受限制的字符串函数

上面给大家介绍的都是长度不受限制的字符串函数,但是其实使用长度受限制的字符串函数相比于不受限制要安全很多,在可以的情况下,我还是希望大家更严谨的选择长度受限制的字符串函数。
用通俗简单的话来讲:其实长度受限制的字符串函数就是在每一个函数的中间加入一个n(str后面),在使用函数的时候限制了你要(cpy)(cat)(cmp)的具体个数,相应的在使用该函数的时候也多了一个参(size_t 类型)

strncpy

功能:拷贝num个字符从源字符串到目标空间
头文件:#include “string.h”

具体用法

#define _CRT_SECURE_NO_WARNINGS 1

#include
#include
#include



int main()
{
	char str1[256] = { 0 };
	char str2[] = "abcdefgh";
	strncpy(str1, str2, 7);
	printf("%sn", str1);

	system("pause");
	return 0;
}

strncat

功能:strncat()将会从字符串src的开头拷贝n 个字符到dest字符串尾部,dest要有足够的空间来容纳要拷贝的字符串。如果n大于字符串src的长度,那么仅将src指向的字符串内容追加到dest的尾部。strncat()会将dest字符串最后的’’覆盖掉,字符追加完成后,再追加’’。
头文件:#include “string.h”

具体用法

#define _CRT_SECURE_NO_WARNINGS 1

#include

#include



int main()
{
	char str1[256] = "abcdefg";
	char str2[] = "higklmn";
	strncat(str1, str2, 5);
	printf("%sn", str1);

	
	return 0;
}

strncmp

功能:功能是把 arr1 和 arr2 进行比较,最多比较前 n 个字节,若arr1与arr2的前n个字符相同,则返回0;若s1大于s2,则返回大于0的值;若s1 小于s2,则返回小于0的值。
注意:
arr1-- 要进行比较的第一个字符串
arr2-- 要进行比较的第二个字符串。
n-- 要比较的最大字符数。
返回值:
如果返回值 < 0,则表示 arr1 小于 arr2。
如果返回值 > 0,则表示 arr2 小于 arr1。
如果返回值 = 0,则表示 arr1 等于 arr2。

具体用法

#define _CRT_SECURE_NO_WARNINGS 1

#include
#include
int main()
{
	char arr1[] = "abcd";
	char arr2[] = "abcefgh";
	int a=strncmp(arr1, arr2, 4);
	printf("%d", a);

	return 0;
}

4.字符串查找函数 strstr

可能很多人都忽略掉了这个我认为非常实用的函数strstr(str1,str2) 函数是字符串处理函数之一,位于头文件 “string.h”中。对于处理字符串的一些问题有很大的帮助。
定义:strstr(str1,str2) 函数用于判断字符串str2是否是str1的子串。如果是,则该函数返回str2在str1中首次出现的地址;否则,返回NULL。

给大家举一个例子:
char arr1[]=“abcdef”;
char arr2[]=“cd”;
则通过函数将返回c的地址,在打印时从首地址开始’’截至
将会打印cdef,如果找不到的话返回空指针NULL

具体用法

#include
#include
#include
int main() {
	char arr1[] = "hello world ";
	char arr2[] = "llo w";
	char* g = strstr(arr1, arr2);//函数调用
	printf("%s", g);
	return 0;
}

strtok

定义
分解字符串为一组字符串。s为要分解的字符,delim为分隔符字符(如果传入字符串,则传入的字符串中每个字符均为分割符)。首次调用时,s指向要分解的字符串,之后再次调用要把s设成NULL。在头文件#include中。

char * strtok ( char * str, const char * sep );

sep参数是个字符串,定义了用作分隔符的字符集合
第一个参数指定一个字符串,它包含了0个或者多个由sep字符串中一个或者多个分隔符分割的标
记。
strtok函数找到str中的下一个标记,并将其用 结尾,返回一个指向这个标记的指针。(注:
strtok函数会改变被操作的字符串,所以在使用strtok函数切分的字符串一般都是临时拷贝的内容
并且可修改。)
strtok函数的第一个参数不为 NULL ,函数将找到str中第一个标记,strtok函数将保存它在字符串
中的位置。
strtok函数的第一个参数为 NULL ,函数将在同一个字符串中被保存的位置开始,查找下一个标
记。
如果字符串中不存在更多的标记,则返回 NULL 指针。
具体用法

#include 
#include 
#pragma warning(disable:4996) 

int main(void) {
    char str[12] = "hello,world";
    char* token = strtok(str, ",");

    while (token != NULL) {
        printf("%sn", token);
        token = strtok(NULL, ",");
    }

    return 0;
}

5.错误信息报告函数 strerror

功能:通过标准错误的标号,获得错误的描述字符串 ,将单纯的错误标号转为字符串描述。首先,系统会根据上一条语句的执行错误情况,将errno赋值.。关于这点,我们首先明白两点。第一,errn是一个系统变量,是不需要我们赋值或者声明的。第二,errn是一个int类型的变量,而且其中的值对应一种特定错误类型
然后,关于streorror()本身,可以这么理解。顾名思义,streorror=string+error,就是将errno值翻译成描述错误类型的string语句!

参数:
errnum:最新的错误标号。
返回值:
指向错误信息的指针。

到这就全部给大家介绍完了
总算完成了这篇万字博客,过程还是挺累的,但是老知识重新回顾的感觉还是挺不错的,又收获到了许多新的理解。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/290886.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号