C语言字符函数与字符串函数详解

 更新时间:2021年09月16日 15:59:59   作者:再吃一个橘子  
这篇文章主要给大家介绍了关于C语言字符/字符串的相关函数,文中通过示例代码总结的非常详细,对大家学习或者使用C语言具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧

本章重点

重点介绍处理字符和字符串的库函数的使用和注意事项

1.求字符串长度 strlen

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

3.长度受限制的字符串函数 strncpy,strncat ,strncmp

4.字符串查找 strstr,strtok

5.错误信息报告 strerror

6.字符操作

7.内存操作函数 memcpy,memmove,memset ,memcmp

前言

C语言中对字符和字符串的处理很是频繁,但是C语言本身是没有字符串类型的,字符串通常放在 常量字符串 中或者 字符数组 中。 字符串常量 适用于那些对它不做修改的字符串函数。

1.strlen函数

size_t strlen ( const char * str );

  • 字符串已经 '\0' 作为结束标志,strlen函数返回的是在字符串中 '\0' 前面出现的字符个数(不包含 '\0' )。
  • 参数指向的字符串必须要以 '\0' 结束。
  • 注意函数的返回值为size_t,是无符号的( 易错 )
  • 学会strlen函数的模拟实现 (计数器、指针-指针、递归)

讲解:

注意点1

有的编译器可能用int来接收strlen函数的返回值会报错,因为strlen函数返回值是size_t( unsigned int 无符号整型 )

	char arr[] = "abcdef";
	//错误示范
	int sz1 = strlen(arr);
	//正确示范
	size_t sz = strlen(arr);

注意点2

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

//3 - 8 < 0?
//strlen函数是size_t类型,是无符号的,必定大于0!!!
int main()
{
	if (strlen("abc") - strlen("abcdefgh") > 0)
	{
		printf("哈哈哈~~");
	}
	else
		printf("吼吼吼!");
	return 0;
}
//运行结果是   哈哈哈~~

对比代码:

int main()
{
	if ((int)strlen("abc") - (int)strlen("abcdefgh") > 0)
	{
		printf("哈哈哈~~");
	}
	else
		printf("吼吼吼!");
	return 0;
}
//运行结果是   吼吼吼!

2.strcpy

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

  • 源字符串必须以 '\0' 结束。
  • 会将源字符串中的 '\0' 拷贝到目标空间。
  • 目标空间必须足够大,以确保能存放源字符串。
  • 目标空间必须可变。( 即:不能是不可修改的常量字符串 )
  • 学会模拟实现。

讲解:

注意点1:

我们发现,copy时,将源字符串毫无保留的( 包括末尾的 '\0' )一块copy到目标字符串中!!

注意点2:

如果源字符串中间本身就含有'\0',那么我们同样还是取到遇见的第一个‘\0' ,不会继续往后打印的!!!

注意点3:

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

	//错误示范
	//目标字符串空间太少
	char arr1[] = "xxx";
	char arr2[] = "hello\0abc";
	strcpy(arr1, arr2);

注意点4:

目标空间必须可变。

模拟strcpy函数

代码1:

#include<stdio.h>
#include<assert.h>
void* my_strcpy(char* dest, const char* src)
{
	assert(dest && src);
	char* ret = dest;
	while (*src)
	{
		*dest = *src;
		dest++;
		src++;
	}
	*dest = '\0';
}
int main()
{
	char arr1[] = "xxxxxxxxxxxxxxxx";
	char arr2[] = "abc";
	my_strcpy(arr1, arr2);
	printf("%s", arr1);
	return 0;
}

代码2:(升级版~~)

#include<stdio.h>
#include<assert.h>
char* my_strcpy(char* dest, const char* src)
{
	assert(dest && src);
	char* ret = dest;
	while (*dest++ = *src++)
	{
		;
	}
	return ret;
}
int main()
{
	char arr1[] = "xxxxxxxxxxxxxxxx";
	char arr2[] = "abc";
	printf("%s", my_strcpy(arr1, arr2));
	return 0;
}

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注脚本之家的更多内容!

相关文章

  • C语言实现出栈序列

    C语言实现出栈序列

    这篇文章主要为大家详细介绍了C语言实现出栈序列,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-05-05
  • C++使用string的大数乘法运算(3)

    C++使用string的大数乘法运算(3)

    这篇文章主要为大家详细介绍了C++使用string的大数乘法运算,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-09-09
  • VC动态生成菜单项的实现方法

    VC动态生成菜单项的实现方法

    这篇文章主要介绍了VC动态生成菜单项的实现方法,在桌面应用程序开发中常会用到的一个功能,需要的朋友可以参考下
    2014-08-08
  • C/C++实现磁盘相关操作的示例代码

    C/C++实现磁盘相关操作的示例代码

    这篇文章主要为大家详细介绍了C/C++如何实现磁盘相关操作,例如遍历磁盘容量、实现磁盘格式化、移除指定磁盘等,感兴趣的小伙伴可以跟随小编一起学习一下
    2023-11-11
  • 解析ActiveMQ的使用说明总结

    解析ActiveMQ的使用说明总结

    本篇文章是对ActiveMQ的使用进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • C语言数据结构中树与森林专项详解

    C语言数据结构中树与森林专项详解

    这篇文章主要介绍了C语言数据结构中树与森林,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧
    2022-11-11
  • C语言详解实现链式二叉树的遍历与相关接口

    C语言详解实现链式二叉树的遍历与相关接口

    二叉树的链式存储结构是指,用链表来表示一棵二叉树,即用链来指示元素的逻辑关系。通常的方法是链表中每个结点由三个域组成,数据域和左右指针域,左右指针分别用来给出该结点左孩子和右孩子所在的链结点的存储地址
    2022-04-04
  • C语言实现推箱子功能汇总

    C语言实现推箱子功能汇总

    这篇文章主要为大家详细介绍了C语言实现推箱子功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-08-08
  • C语言详细分析结构体的内存对齐规则

    C语言详细分析结构体的内存对齐规则

    C 数组允许定义可存储相同类型数据项的变量,结构是 C 编程中另一种用户自定义的可用的数据类型,它允许你存储不同类型的数据项,本篇让我们来了解C 的结构体内存对齐
    2022-07-07
  • C语言数据的存储超详细讲解下篇浮点型在内存中的存取

    C语言数据的存储超详细讲解下篇浮点型在内存中的存取

    使用编程语言进行编程时,需要用到各种变量来存储各种信息。变量保留的是它所存储的值的内存位置。这意味着,当您创建一个变量时,就会在内存中保留一些空间。您可能需要存储各种数据类型的信息,操作系统会根据变量的数据类型,来分配内存和决定在保留内存中存储什么
    2022-04-04

最新评论