学C的第二十八天【字符串函数和内存函数的介绍(一)】

这篇具有很好参考价值的文章主要介绍了学C的第二十八天【字符串函数和内存函数的介绍(一)】。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

=========================================================================

相关代码gitee自取:C语言学习日记: 加油努力 (gitee.com)

 =========================================================================

接上期

学C的第二十七天【指针的进阶(三)】_高高的胖子的博客-CSDN博客

 =========================================================================

                     

前言:

(1).

C语言中对于字符字符串的处理很是频繁,但是C语言本身没有字符串类型字符串通常放在 常量字符串 中或者 字符数组

             

(2).

字符串常量 适用于那些对其不做修改字符串函数

             

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

             

1 . 函数介绍

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

函数返回值类型和相关参数:

             

size_t strlen ( const char * str );

                    

(接收 常量字符指针 ,返回 无符号整数

                    

注意事项:

(1).

字符串以 '\0' 作为结束标志,需要 string.h 头文件strlen函数返回的是在字符串中 '\0' 前面出现的字符个数不包 含 '\0' )。

                  

(2).

参数指向的字符串必须要以 '\0' 结束(不然统计个数为随机值)。

                

(3).

注意函数的返回值为size_t,是无符号的( 易错 ),如下:

学C的第二十八天【字符串函数和内存函数的介绍(一)】,CCC全是C,c语言,c++

                

(4).

学会strlen函数的模拟实现(下面第2个模块有)

                     


                    

(2). strcpy()函数:拷贝字符串

函数返回值类型和相关参数:

             

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

                     

(接收 目标空间指针内容不能被修改的源字符串指针 ,返回 目标空间指针

学C的第二十八天【字符串函数和内存函数的介绍(一)】,CCC全是C,c语言,c++

                    

注意事项:

(1).

源字符串指针 指向的 字符串 复制目标空间指针 指向的空间 中,

包括 终止空字符即 \0 ,并在该点停止

                  

(2).

源字符串必须以 '\0' 结束

                

(3).

会将源字符串中的 '\0' 拷贝到目标空间

                

(4).

目标空间必须足够大,以确保能存放源字符串

                

(5).

目标空间必须可变

                

(6).

学会strcpy函数的模拟实现(下面第2个模块有)

                     


                    

(3). strcat()函数:追加字符串到另一字符串后

函数返回值类型和相关参数:

             

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

                     

(接收 目标空间指针内容不能被修改的源字符串指针 ,返回 目标空间指针

学C的第二十八天【字符串函数和内存函数的介绍(一)】,CCC全是C,c语言,c++

                    

注意事项:

(1).

源字符串的副本追加到目标字符串

目的地中的 '\0' 源字符串的第一个字符覆盖

并且 '\0'在新字符串的末尾

需要<string.h>头文件。

                  

(2).

源字符串必须以 '\0' 结束

                

(3).

目标空间必须有足够的大,能容纳下源字符串的内容

                

(4).

目标空间必须可修改

             

(5).

学会strlen函数的模拟实现(下面第2个模块有)

                     


                    

(4). strcmp()函数:比较两个字符串的大小

函数返回值类型和相关参数:

             

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

             

(接收 两个常量字符串的首字符指针,返回 一个整数

学C的第二十八天【字符串函数和内存函数的介绍(一)】,CCC全是C,c语言,c++

                    

注意事项:

(1).

此函数开始比较时会比较每个字符串的第一个字符

如果它们彼此相等,则继续比较下一对

直到 字符不同 比较完所有字符都相同 为止

                  

(2). 标准规定

                   

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

(假设 “abcdef” 和 “abc” 比较,abc都相等第四次比较时 e>\0,那么"abcdef"更大返回 大于0 的数字

             

第一个字符串的字符 等于 第二个字符串的字符,则 返回0

(假设 “abc” 和 “abc” 比较,abc都相等第四次比较时 \0==\0返回 0

                         

第一个字符串的字符 小于 第二个字符串的字符,则返回 小于0 的数字

(假设 “abcdef” 和 “abq” 比较,a和b都相等第三次比较时 c<q,那么"abq"更大返回小于0 的数字

                    

(3).

学会strlen函数的模拟实现(下面第2个模块有)

                     


                    

(5). strncpy()函数:拷贝字符串的num个字符

函数返回值类型和相关参数:

             

char * strncpy ( char * destination, const char * source, size_t num );

                   

和 strcpy()函数 相同,只是参数多了个 拷贝的字符个数

学C的第二十八天【字符串函数和内存函数的介绍(一)】,CCC全是C,c语言,c++

                    

注意事项:

(1).

将 源字符串指针 指向的 字符串前num个字符 复制到 目标空间指针 指向的空间 中,

包括 终止空字符,即 \0 ,并在该点停止。(和strcpy()函数类似但限制了拷贝个数

                  

(2).

源字符串拷贝num个字符到目标空间

                

(3).

如果源字符串的长度小于num,则拷贝完源字符串之后,在目标的空间后边追加0直到num个

学C的第二十八天【字符串函数和内存函数的介绍(一)】,CCC全是C,c语言,c++

                     


                    

(6). strncat()函数:追加字符串的num个字符到另一字符串

函数返回值类型和相关参数:

             

char * strncat ( char * destination, const char * source, size_t num );

                   

和 strcat()函数 相同,只是参数多了个 拷贝的字符个数

                    

注意事项:

(1).

源字符串的副本的num个字符追加到目标字符串。

目的地中的 '\0' 被源字符串的第一个字符覆盖,

并且 '\0' 会在新字符串的末尾。

和strcat()函数类似但限制了追加个数

                  

(2).

如果源字符串的长度小于num,也只追加 源字符串 的字符串
    不会像strncpy一样补0

学C的第二十八天【字符串函数和内存函数的介绍(一)】,CCC全是C,c语言,c++

                     


                    

(7). strncmp()函数:在num个字符内比较两个字符串

函数返回值类型和相关参数:

             

int strncmp ( const char * str1, const char * str2, size_t num );

            

和 strcmp()函数 相同,只是参数多了个 限定在num个字符中比较

学C的第二十八天【字符串函数和内存函数的介绍(一)】,CCC全是C,c语言,c++

                    

注意事项:

(1).

比较到出现另个字符不一样或者一个字符串结束或者num个字符全部比较完

                        


                    

(8). strstr()函数:在字符串中找子字符串

函数返回值类型和相关参数:

             

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

                   

(参数接收 两个常量字符串,返回 字符指针

学C的第二十八天【字符串函数和内存函数的介绍(一)】,CCC全是C,c语言,c++

                    

注意事项:

(1).

str1 中 找 str2 首次出现的地址,如果 str2 中没有 str1 返回 空指针NULL

        

(4).

学会strstr函数的模拟实现(下面第2个模块有)

             


                    

(9). strtok()函数:使用自定义分隔符对字符串进行分割

函数返回值类型和相关参数:

             

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

                      

(参数接收 被分割的字符串首字符地址 指定的分隔符指针

返回 被分割的子字符串指针

学C的第二十八天【字符串函数和内存函数的介绍(一)】,CCC全是C,c语言,c++

                    

注意事项:

(1).

sep参数是个字符串,定义了用作分隔符的字符集合

                  

(2).

str参数指定一个字符串,它包含了0个或者多个由sep字符串中一个或者多个分隔符分割的标记

                

(3).

strtok函数找到str中的下一个标记,并将其用 \0 结尾把找到的标记变为 \0 ),

返回一个指向这个标记的指针

(注: strtok函数会改变被操作的字符串,所以在使用strtok函数切分的字符串一般都是临时拷贝的内容 并且可修改。)

                

(4).

strtok函数第一个参数不为 NULL ,函数将找到str中第一个标记,strtok函数将保存它在字符串中的位置

                

(5).

strtok函数第一个参数为 NULL ,函数将在同一个字符串中被保存的位置开始查找下一个标记

                

(6).

如果字符串中不存在更多的标记,则返回 NULL 指针

                     


                    

(10). strerror()函数:将错误码以字符串形式提供出来

函数返回值类型和相关参数:

             

char * strerror ( int errnum );

                      

(参数接收 错误码,返回 错误码的字符串信息地址

学C的第二十八天【字符串函数和内存函数的介绍(一)】,CCC全是C,c语言,c++

                     

注意事项:

(1).

库函数在执行时,发生了错误,会将一个错误码存放在 errno 这个变量中

errno C语言提供的一个全局变量

         

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

             

2 . 库函数的模拟实现

(1). 模拟实现strlen()函数:

方法1:计数器方式

学C的第二十八天【字符串函数和内存函数的介绍(一)】,CCC全是C,c语言,c++

                

对应代码:
#include <stdio.h>
//方法1:计数器方式
size_t my_strlen(const char* str)
	//和库函数的strlen函数一样
	//返回值为无符号整型,参数为常量字符指针
{
	int count = 0; //计数器
	while (*str != '\0')
		//还没到结束符就继续统计
	{
		count++;//没到结束符就统计+1
		str++;//判断下一位
	}
	return count;//返回计数器
}

int main()
{
	size_t sz = my_strlen("abc");
	//使用模拟实现的strlen函数返回一个size_t(无符号整数)的数

	//进行打印:
	printf("%u\n", sz);
	//%u:打印无符号的数

	return 0;
}

                  

方法2:指针方式

学C的第二十八天【字符串函数和内存函数的介绍(一)】,CCC全是C,c语言,c++

                

对应代码:
#include <stdio.h>
//方法2:指针方式
size_t my_strlen(const char* str)
//和库函数的strlen函数一样
//返回值为无符号整型,参数为常量字符指针
{
	char* p = str;
	while (*p != '\0')
		//还没到结束符就继续统计
	{
		p++;//没指向结束符就判断下一位
	}

	return p-str;//用移动后的指针 - 原来的指针 == 字符串长度
}

int main()
{
	size_t sz = my_strlen("abc");
	//使用模拟实现的strlen函数返回一个size_t(无符号整数)的数

	//进行打印:
	printf("%u\n", sz);
	//%u:打印无符号的数

	return 0;
}

                  

方法3:迭代方式

学C的第二十八天【字符串函数和内存函数的介绍(一)】,CCC全是C,c语言,c++

                

对应代码:
#include <stdio.h>
//方法3:迭代方式
size_t my_strlen(const char* str)
//和库函数的strlen函数一样
//返回值为无符号整型,参数为常量字符指针
{
	if (*str == '\0')
	{
		return 0;//如果第一个就指向\0,说明长度是0
	}
	else
	{
		return 1 + my_strlen(str + 1);
	}
}

int main()
{
	size_t sz = my_strlen("abc");
	//使用模拟实现的strlen函数返回一个size_t(无符号整数)的数

	//进行打印:
	printf("%u\n", sz);
	//%u:打印无符号的数

	return 0;
}

                  

(2). 模拟实现strcpy()函数:

主函数:

学C的第二十八天【字符串函数和内存函数的介绍(一)】,CCC全是C,c语言,c++

                    

模拟实现strcpy()函数:

学C的第二十八天【字符串函数和内存函数的介绍(一)】,CCC全是C,c语言,c++

                  

对应代码:
//模拟strcpy函数:
#include <stdio.h>
#include <assert.h>
char* my_strcpy(char* dest, const char* src)
//返回值类型 和 参数 与库函数strcpy相同
//返回值设置为char*,是为了能够使用链式访问,把返回值作为其它函数的参数
{
	//保存目标空间指针原位置,方便最后进行返回
	char* ret = dest;

	//进行断言,两个指针都不为空指针,需要头文件<assert.h>
	assert(dest != NULL);
	assert(src != NULL);

	//只要 源字符串 还没指向 \0 就继续循环拷贝
	while (*src != '\0')
	{
		*dest = *src; //将源字符串的一位赋给目标空间
		//下次赋值下一位,所以要移动两个指针:
		dest++;
		src++;
	}

	//循环中没有将 \0 赋给目标空间,所以要加上:
	*dest = *src;
	//循环完后,dest移向了新位置,src在\0位置,所以直接赋值即可

	//返回拷贝后的目标指针原地址:
	return ret;
}

int main()
{
	//目标空间(字符数组):
	char arr1[20] = "xxxxxxxxxxxxxxxx";
	//源字符串:
	char arr2[] = "hello world";

	my_strcpy(arr1, arr2); //使用模拟的函数来拷贝
	//arr1为目标空间指针,arr2为源字符串指针
	//将arr2指向的内容 拷贝到 目标空间指针中

	//打印拷贝结果:
	printf("%s\n", arr1);

	return 0;
}

                       

可进行化简:

学C的第二十八天【字符串函数和内存函数的介绍(一)】,CCC全是C,c语言,c++

                 

对应代码:
//模拟strcpy函数:
#include <stdio.h>
#include <assert.h>
char* my_strcpy(char* dest, const char* src)
//返回值类型 和 参数 与库函数strcpy相同
//返回值设置为char*,是为了能够使用链式访问,把返回值作为其它函数的参数
{
	//保存目标空间指针原位置,方便最后进行返回
	char* ret = dest;

	//进行断言,两个指针都不为空指针,需要头文件<assert.h>
	assert(dest != NULL);
	assert(src != NULL);

	//只要 源字符串 还没指向 \0 就继续循环拷贝
	while (*dest++ = *src++)
	{
		;
	}

	//返回拷贝后的目标指针原地址:
	return ret;
}

int main()
{
	//目标空间(字符数组):
	char arr1[20] = "xxxxxxxxxxxxxxxx";
	//源字符串:
	char arr2[] = "hello world";

	my_strcpy(arr1, arr2); //使用模拟的函数来拷贝
	//arr1为目标空间指针,arr2为源字符串指针
	//将arr2指向的内容 拷贝到 目标空间指针中

	//打印拷贝结果:
	printf("%s\n", arr1);

	return 0;
}

                

(3). 模拟实现strcat()函数:

学C的第二十八天【字符串函数和内存函数的介绍(一)】,CCC全是C,c语言,c++

                  

对应代码:

//模拟strcat函数:
#include <stdio.h>
#include <string.h>
#include <assert.h>

char* my_strcat(char* dest, const char* src)
{
	//进行断言,两个字符串都不为\0 (空)
	assert(dest);
	assert(src);

	//保存目标地址的原位置
	char* ret = dest;

	//找到目标字符串的\0,作为连接的起点:
	while (*dest)
	{
		dest++;
	}

	//开始连接字符串,和strcpy是一样的
	while (*dest++ = *src++)
	{
		;
	}

	//返回连接后的目标空间指针:
	return ret;
}

int main()
{
	//目标空间(数组):
	char arr1[20] = "hello";

	//源字符串:
	char arr2[] = " world";

	//使用模拟的自定义函数,将arr2连接到arr1后
	my_strcat(arr1, arr2);

	//打印连接后的新字符串:
	printf("%s\n", arr1);

	return 0;
}

                

(4). 模拟实现strcmp()函数:

学C的第二十八天【字符串函数和内存函数的介绍(一)】,CCC全是C,c语言,c++

                  

对应代码:

//模拟strcmp函数:
#include <stdio.h>
int my_strcmp(const char* str1, const char* str2)
{
	while (*str1 == *str2)
		//两字符串同位置上的值相同的情况
	{
		if (*str1 == '\0')
			//同位置上都是\0说明两个字符串相同
		{
			return 0; //相同则返回 0
		}
		//不是\0,是其它值相同,则判断下一位
		str1++;
		str2++;
	}

	if (*str1 > *str2)
		//当前位置,字符串1的字符大于字符串的字符
	{
		return 1; //大于则返回大于0的数
	}
	else
		//当前位置,字符串1的字符小于字符串的字符
	{
		return -1; //小于则返回小于0的数
	}
}

int main()
{
	//使用自定义函数进行比较:
	int ret = my_strcmp("abq", "abc");

	printf("%d\n", ret);

	return 0;
}

                

(5). 模拟实现strstr()函数:

模拟的自定义函数:

学C的第二十八天【字符串函数和内存函数的介绍(一)】,CCC全是C,c语言,c++

                      

主函数:

学C的第二十八天【字符串函数和内存函数的介绍(一)】,CCC全是C,c语言,c++

                   文章来源地址https://www.toymoban.com/news/detail-578120.html

对应代码:
//模拟strncmp函数:
#include <stdio.h>
#include <string.h>
char* my_strstr(char* str1, char* str2)
{
	char* cp = str1; //开始进行判断的初始位置指针
	char* s1 = cp; //在arr1中的cp位置开始逐位进行匹配的指针
	char* s2 = str2; //在arr2中逐位进行匹配的指针

	//如果要找的子字符串为空指针,则返回str1:
	if (*str2 == '\0')
	{
		return str1;
	}

	while (*cp != '\0')
		// \0之后不可能找到arr2的内容
	{
		//开始匹配:
		s1 = cp; //让s1在初始位置开始进行逐位判断
		s2 = str2;

		while (*s1 != '\0' && *s2 != '\0' && *s1 == *s2)
			//两字符串都未到\0,如果当前位置的内容相同,则再循环判断下一位
		{
			s1++;
			s2++;
		}

		if (*s2 == '\0')
			//如果子字符串已经到了\0,
			//说明arr1中有arr2,匹配成功
		{
			return cp; 
			//匹配成功,则返回子字符串的初始位置
		}

		cp++; //判断arr1下一个初始位置
	}

	return NULL; //未找到则返回空指针
}

int main()
{
	char arr1[] = "abbbcdef";
	char arr2[] = "bbc";

	//使用自定义函数进行查找:
	char* ret = my_strstr(arr1, arr2);
	if (ret != NULL)
	{
		printf("%s\n", ret);
	}
	else
	{
		printf("未找到");
	}

	return 0;
}

到了这里,关于学C的第二十八天【字符串函数和内存函数的介绍(一)】的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • python爬虫学习第二十八天-------了解scrapy(二十八天)

    python爬虫学习第二十八天-------了解scrapy(二十八天)

    🎈🎈作者主页: 喔的嘛呀🎈🎈 🎈🎈所属专栏:python爬虫学习🎈🎈 ✨✨谢谢大家捧场,祝屏幕前的小伙伴们每天都有好运相伴左右,一定要天天开心哦!✨✨  hello,兄弟姐妹们!我是喔的嘛呀。今天我们首先来了解scrapy。为后面的学习打下基础。 一、scrapy是什么?

    2024年04月25日
    浏览(10)
  • 蓝桥杯31天真题冲刺|题解报告|第二十八天

    大家好,我是snippet,今天是我们刷题的第二十八天,距离我们刷题活动结束也就只有几天了,最近刷题有点迷茫了,下面是我今天的题解 目录 一、路标设置 题目链接:P3853 [TJOI2007]路标设置 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 题目内容: 解题思路: 代码: 题目链接

    2023年04月08日
    浏览(10)
  • MFC第二十八天 WM_SIZE应用,CFrameWnd类LoadFrame的方法,PreCreateWindow窗口预处理,Frame-view窗口视图

    MFC第二十八天 WM_SIZE应用,CFrameWnd类LoadFrame的方法,PreCreateWindow窗口预处理,Frame-view窗口视图

    点击相应控件的属性,对其进行动态布局的设置,选择两者,窗口再次进行拉伸就会进行改变。 a)CFrameWnd类偏爱WM_CREATE,因为所有的内部窗口都是代码创建的。 而不像对话框是拖入的。 b)CFrameWnd::rectDefault管理层叠 static const CRect rectDefault; c)LoadFrame内部包含CreateFrame,同时执行

    2024年02月14日
    浏览(10)
  • 字符串中的第一个唯一字符(字符串)

    给定一个字符串 s ,找到 它的第一个不重复的字符,并返回它的索引 。如果不存在,则返回 -1 。 示例 1: 输入: s = “leetcode” 输出: 0 示例 2: 输入: s = “loveleetcode” 输出: 2 示例 3: 输入: s = “aabb” 输出: -1 提示: 1 = s.length = 105 s 只包含小写字母 题解思路: 1.HashMap解决 2.统

    2023年04月09日
    浏览(4)
  • 字符串中的第一个唯一字符

    字符串中的第一个唯一字符

     这段代码的作用是在一个字符串 s 中找到第一个不重复(只出现一次)的字符,并返回它的下标。具体实现方式如下: 定义变量 i 表示当前处理的字符下标,定义字符串 rem 表示已经检查过的字符集合。 使用 while 循环遍历整个字符串,对于每个字符执行以下操作: a. 在该

    2024年02月01日
    浏览(4)
  • 前端算法题——字符串中的第一个唯一字符

    给定一个字符串,找到它的第一个不重复的字符,并返回它的索引。如果不存在,则返回 -1。 遍历字符串 用一个对象来记数,出现过一次就+1, 遍历完毕,再次遍历字符串,看它们在之前记录的对象里的值,是否是1,是就返回下标,不是返回-1。

    2024年02月22日
    浏览(5)
  • 力扣热门算法题 349. 两个数组的交集,387. 字符串中的第一个唯一字符,394. 字符串解码

    力扣热门算法题 349. 两个数组的交集,387. 字符串中的第一个唯一字符,394. 字符串解码

    349. 两个数组的交集,387. 字符串中的第一个唯一字符,394. 字符串解码,每题做详细思路梳理,配套PythonJava双语代码, 2024.04.02 可通过leetcode所有测试用例。 目录 349. 两个数组的交集 解题思路 完整代码 Python Java 387. 字符串中的第一个唯一字符 解题思路 完整代码 Python Java

    2024年04月08日
    浏览(11)
  • 【LeetCode】917. 仅仅反转字母、387. 字符串中的第一个唯一字符

    【LeetCode】917. 仅仅反转字母、387. 字符串中的第一个唯一字符

     作者:小卢   专栏:《Leetcode》 喜欢的话:世间因为少年的挺身而出,而更加瑰丽。                                  ——《人民日报》 目录  917. 仅仅反转字母  387. 字符串中的第一个唯一字符 917. 仅仅反转字母  题目描述: 给你一个字符串  s  ,根据下述规则反转

    2023年04月12日
    浏览(11)
  • 【Python3】【力扣题】387. 字符串中的第一个唯一字符

    【Python3】【力扣题】387. 字符串中的第一个唯一字符

    【力扣题】题目描述: 【Python3】代码: 1、解题思路:遍历字符串,依次判断元素在字符串中的个数是否为1,第一个为1的返回该元素的索引号,若整个字符串都没有个数为1的,则返回-1。 知识点:enumerate(序列):返回可迭代的序列中所有索引号和对应元素,元组形式 (索引

    2024年01月18日
    浏览(9)
  • c++:string相关的oj题(把字符串转换成整数、344.反转字符串、387. 字符串中的第一个唯一字符、917. 仅仅反转字母)

    c++:string相关的oj题(把字符串转换成整数、344.反转字符串、387. 字符串中的第一个唯一字符、917. 仅仅反转字母)

    传送门 首先处理空字符串为空的情况() 再处理第一个字符可能为 + - 的情况,直接定一个 flag 初始化为1,遇到 - 就赋值为-1 接下来就利用迭代器进行循环,如果是字符数字就直接使用 ret = ret * 10 + (*it - \\\'0\\\'); 是其他字符,直接return 0;了 传送门 大家学习了c++,可能直接就想

    2024年01月23日
    浏览(15)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包