【C生万物】 字符串&内存函数篇 (上)

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

 欢迎来到 Claffic 的博客 💞💞💞                               👉 专栏:《C生万物 | 先来学C》👈

【C生万物】 字符串&内存函数篇 (上)

前言:

过了指针这个坎后,下一步就是C语言中关于字符的处理,这一期来讲讲常用字符函数和字符串函数:strlen,strcpy,strcat,memcpy,memmove,memcmp 等。 


目录

Part1:写在前面

Part2:函数介绍

1.strlen

2.strcpy

3.strcat

4.strcmp

5.strncpy

6.strncat

7.strncmp

8.strstr

9.strtok

10.memcpy

11.memmove

12.memcmp 


Part1:写在前面

说到字符串大家应该不陌生了,但你知道如何处理字符串吗?

C 语言中对字符和字符串的处理很是频繁,但是 C 语言本身是没有字符串类型的(在C++中解决了这个问题,引入了string类),字符串通常放在常量字符串中或者 字符数组 中。
字符串常量 适用于那些对它不做修改的字符串函数 .

Part2:函数介绍

1.strlen

strlen - C++ Reference (cplusplus.com)https://legacy.cplusplus.com/reference/cstring/strlen/?kw=strlen

size_t strlen ( const char * str );

这个函数是获取字符串长度的,下面是注意的点:

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

可以利用此函数来比较两个字符串的大小:

#include<stdio.h>
#include<string.h>
int main()
{
	const char* str1 = "abcdef";
	const char* str2 = "ggg";
	if (strlen(str2) - strlen(str1) > 0)
	{
		printf("str2>str1\n");
	}
	else
	{
		printf("srt1>str2\n");
	}
	return 0;
}

👁️‍🗨️运行结果: 

【C生万物】 字符串&内存函数篇 (上)

2.strcpy

strcpy - C++ Reference (cplusplus.com)https://legacy.cplusplus.com/reference/cstring/strcpy/?kw=strcpy

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

这个函数是用来拷贝字符串的

注意传参:将后部的字符串拷贝到前部的空间中

• 源字符串必须以 '\0' 结束;
• 会将源字符串中的 '\0' 拷贝到目标空间;
• 目标空间必须足够大,以确保能存放源字符串;
• 目标空间必须可变。

例子:

#include<stdio.h>
#include<string.h>
int main()
{
	char str1[40];
	const char* str2 = "abc";
	char* str = strcpy(str1, str2);
	printf("%s\n", str);

	return 0;
}

 👁️‍🗨️运行结果: 

【C生万物】 字符串&内存函数篇 (上)

3.strcat

strcat - C++ Reference (cplusplus.com)https://legacy.cplusplus.com/reference/cstring/strcat/?kw=strcat

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

这个函数是在一个字符串末尾追加字符串的

• 源字符串必须以 '\0' 结束;
• 目标空间必须有足够的大,能容纳下源字符串的内容;
• 目标空间必须可修改。

例子:

#include<stdio.h>
#include<string.h>
int main()
{
	char str[80];
	strcpy(str, "these ");
	strcat(str, "strings ");
	strcat(str, "are ");
	strcat(str, "concatenated.");
	puts(str); // 输出字符串,传递char*类型,遇到\0结束
	return 0;
}

👁️‍🗨️运行结果:

【C生万物】 字符串&内存函数篇 (上)

4.strcmp

strcmp - C++ Reference (cplusplus.com)https://legacy.cplusplus.com/reference/cstring/strcmp/?kw=strcmp

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

这个函数的作用就是比较两个字符串的

标准规定: 

• 第一个字符串大于第二个字符串,则返回大于0 的数字;
• 第一个字符串等于第二个字符串,则返回0;
• 第一个字符串小于第二个字符串,则返回小于0 的数字。

注意注意:不是比较字符串的长度,而是一个字符一个字符地比较字符的 ASCII 码值

例子:

#include<stdio.h>
#include<string.h>
int main()
{
	char* str1 = "abcdef"; 
	char* str2 = "abcdef";
	char* str3 = "abcde";
	char* str4 = "cpp";

	printf("%d\n", strcmp(str1, str2));
	printf("%d\n", strcmp(str1, str3));
	printf("%d\n", strcmp(str1, str4)); // 第一个字符就小

	return 0;
}

 👁️‍🗨️运行结果:

【C生万物】 字符串&内存函数篇 (上)

其实这个函数的最大作用就是0的情况,即判断两个字符串相等。

5.strncpy

strncpy - C++ Reference (cplusplus.com)https://legacy.cplusplus.com/reference/cstring/strncpy/?kw=strncpy

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

这个函数也是拷贝字符串的,不过它相比 strcpy 多了一个参数 num ,说明可以指定拷贝字符串的字符个数。

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

例子:

#include<stdio.h>
#include<string.h>
int main()
{
	char str1[40] = { '0' };
	char str2[30] = { '0' };
	const char* str3 = "abcdef";

	strncpy(str1, str3, 6);
	strncpy(str2, str3, 2);

	printf("%s\n", str1);
	printf("%s\n", str2);

	return 0;
}

👁️‍🗨️输出结果: 

【C生万物】 字符串&内存函数篇 (上)

6.strncat

 strncat - C++ Reference (cplusplus.com)https://legacy.cplusplus.com/reference/cstring/strncat/?kw=strncat

这个函数也是,加了 n ,可控制要追加的字符长度

• 追加字符,

例子:

#include <stdio.h>
#include <string.h>
int main()
{
	char str1[20];
	char str2[20];
	strcpy(str1, "To be "); str1 中存入 To be
	strcpy(str2, "or not to be"); str2 中存入 or not to be
	strncat(str1, str2, 6); str1 追加 str2 中的6个字符 or no
	puts(str1);
	return 0;
}

👁️‍🗨️输出结果: 

【C生万物】 字符串&内存函数篇 (上)

7.strncmp

 strncmp - C++ Reference (cplusplus.com)https://legacy.cplusplus.com/reference/cstring/strncmp/?kw=strncmp

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

相比 strcmp,它可以指定最多比较 num 个字符

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

例子:

#include <stdio.h>
#include <string.h>
int main()
{
	char str[][5] = { "R2D2" , "C3PO" , "R2A6" };
	int n;
	puts("Looking for R2 astromech droids...");
	for (n = 0; n < 3; n++)
	{
		if (strncmp(str[n], "R2xx", 2) == 0)
			printf("found %s\n", str[n]);
	}
	return 0;
}

 👁️‍🗨️输出结果: 

【C生万物】 字符串&内存函数篇 (上)

这个例子的意思就是在 str 中寻找含有 R2 的字符串。

8.strstr

strstr - C++ Reference (cplusplus.com)https://legacy.cplusplus.com/reference/cstring/strstr/?kw=strstr

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

这个函数的作用就是寻找相等的字符串,返回指针类型

• 在 str1 中寻找 str2 ,找到了就返回指向 str1 中与 str2 相同字符的指针,如果没有(str2 不是 str1 的一部分),就返回 NULL

• 匹配过程不包括空字符串。 

例子:

#include <stdio.h>
#include <string.h>
int main()
{
	char str[] = "This is a simple string";
	char* pch;
	pch = strstr(str, "simple");
	if (pch != NULL)
		strncpy(pch, "sample", 6);
	puts(str);
	return 0;
}

👁️‍🗨️输出结果:

【C生万物】 字符串&内存函数篇 (上)

简单解释,在 str 中寻找字符串 simple,将其地址保存到 pch 中,再将 simple 替换为 sample,最终输出替换后的结果。

9.strtok

strtok - C++ Reference (cplusplus.com)https://legacy.cplusplus.com/reference/cstring/strtok/?kw=strtok

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

这个函数是做字符串切分的

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

看着挺复杂的,其实... ...就是复杂的。

接下来看个例子,相信会好些:

#include <stdio.h>
#include <string.h>
int main()
{
	char str[] = "- This, a sample string.";
	char* pch;
	printf("Splitting string \"%s\" into tokens:\n", str);
	pch = strtok(str, " ,.-"); // 分割符可以是字符集合
	while (pch != NULL)
	{
		printf("%s\n", pch);
		pch = strtok(NULL, " ,.-");
	}
	return 0;
}

 👁️‍🗨️输出结果:

【C生万物】 字符串&内存函数篇 (上)

这个例子就是将字符串 - This, a sample string. 按照 , - . 三个分隔符切割,注意进行多个字符的切割时,要进行 pch = strtok(NULL, " ,.-"); 操作,对应 strtok 函数的第一个参数为 NULL ,函数将在同一个字符串中被保存的位置开始,查找下一个标记 

10.memcpy

 
memcpy - C++ Reference (cplusplus.com)https://legacy.cplusplus.com/reference/cstring/memcpy/?kw=memcpy

void * memcpy ( void * destination, const void * source, size_t num );

这个 void 类型不是没有,而是可以接受多种类型 

这个函数是复制数据用的

• 函数  memcpy  从  source  的位置开始向后复制  num  个字节的数据到  destination  的内存位置;
• 这个函数在遇到 '\0' 的时候并 不会 停下来;
• 如果 source   和  destination   有任何的重叠,复制的结果都是未定义的。  

例子:

#include <stdio.h>
#include <string.h>

struct 
{
	char name[40];
	int age;
} person, person_copy;

int main()
{
	char myname[] = "Pierre de Fermat";

	/* using memcpy to copy string: */
	memcpy(person.name, myname, strlen(myname) + 1);// +1是要把'\0'拷贝上 
	person.age = 46;

	/* using memcpy to copy structure: */
	memcpy(&person_copy, &person, sizeof(person));

	printf("person_copy: %s, %d \n", person_copy.name, person_copy.age);

	return 0;
}

👁️‍🗨️输出结果:

【C生万物】 字符串&内存函数篇 (上)

解释:定义了一个结构体,包含名字和年龄,先将 myname 中的内容拷贝到结构体的 name 成员中,再将整个结构体拷贝给自己(可拷贝类型有多种)。 

11.memmove

 
memmove - C++ Reference (cplusplus.com)https://legacy.cplusplus.com/reference/cstring/memmove/?kw=memmove

void * memmove ( void * destination, const void * source, size_t num );

参数类型与 memcpy 是相同的,两者的不同在哪里呢?

• 差别就是 memmove 函数处理的源内存块和目标内存块是可以重叠的;

• 如果源空间和目标空间出现重叠,就得使用 memmove 函数处理。

也就是说,在不确定源空间和目标空间是否重叠的情况下,memmove 可以保证拷贝的内容是正确的,所以 memmove 相比 memcpy 更安全。

例子:

#include <stdio.h>
#include <string.h>

int main()
{
	char str[] = "memmove can be very useful......";
	memmove(str + 20, str + 15, 11);
	puts(str);
	return 0;
}

👁️‍🗨️输出结果:

【C生万物】 字符串&内存函数篇 (上)

这个例子可以充分说明源空间和目标空间存在重叠的时候可以保证拷贝成功。

12.memcmp 

memcmp - C++ Reference (cplusplus.com)https://legacy.cplusplus.com/reference/cstring/memcmp/?kw=memcmp

int memcmp ( const void * ptr1, const void * ptr2, size_t num );

看返回类型是 int 类型,啊哈,这个函数是比较两个数据的

• 比较从  ptr1    ptr2  指针开始的  num  个字节;

例子:

#include <stdio.h>
#include <string.h>

int main()
{
	char buffer1[] = "DWgaOtP12df0";
	char buffer2[] = "DWGAOTP12DF0";
	int n;
	n = memcmp(buffer1, buffer2, sizeof(buffer1));
	// 注意:大写字符的ASCII码值 小于 小写字符的ASCII码值
	if (n > 0) 
		printf("'%s' is greater than '%s'.\n", buffer1, buffer2);
	else if (n < 0) 
		printf("'%s' is less than '%s'.\n", buffer1, buffer2);
	else 
		printf("'%s' is the same as '%s'.\n", buffer1, buffer2);

	return 0;
}

👁️‍🗨️输出结果:

【C生万物】 字符串&内存函数篇 (上)

大写字符的ASCII码值 小于 小写字符的ASCII码值

所以才会有这样的结果,跟想想中的不一样... ... 


总结: 

这期主要是带大家认识各种常见的字符串处理函数,知道有这些好用的函数并且会应用就可以了,下期带大家尝试实现几个其中的函数。

码文不易 

如果你觉得这篇文章还不错并且对你有帮助,不妨支持一波哦  💗💗💗文章来源地址https://www.toymoban.com/news/detail-462314.html

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

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

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

相关文章

  • 字符串函数和内存函数详解(2)

    🐵本文会将会对剩余的 字符串库函数 和 内存函数 进行讲解 strstr函数原型: strstr用于在字符串中找子串,strstr会返回str1中出现str2的起始地址,如果在str1中没有找到str2,则返回空指针 strstr会返回arr1中第一次出现arr2的地址,这里就是\\\'l\\\'的地址,将其传给指针ret,在打印时

    2024年02月07日
    浏览(42)
  • 字符串和内存函数(2)

    2.13 memcpy void* memcpy(void* destination, const void* source, size_t num); 函数memcpy从source的位置开始向后复制num个 字节 的数据到destination的内存位置。 这个函数在遇到 ‘\\0’ 的时候并不会停下来。 如果source和destination有任何的重叠,复制的结果都是未定义的。 memcpy是内存拷贝,它可以拷

    2024年02月04日
    浏览(38)
  • <C语言> 字符串内存函数

    C语言中对字符和字符串的处理很是频繁,但是C语言本身是没有字符串类型的,字符串通常放在 常量字符串 或者 字符数组 中。 字符串常量 适用于那些对它不做修改的字符串函数. 注意:字符串函数都需要包含头文件string.h strlen() 函数用于计算字符串的长度,即字符串中字符

    2024年02月15日
    浏览(47)
  • c语言——字符串函数和内存操作函数

    包含在string.h头文件里 功能:返回字符串中有效字符的个数,遇到‘\\0’结束,不包括结束符‘\\0’. 函数的参数为------const char* str:字符指针 返回值的类型------size_t:无符号整数(即:unsigned int) 模拟实现strlen: 方法一:计数器的方法 方法二:不能创建临时变量的计数器

    2024年02月14日
    浏览(69)
  • 【C】字符串函数和内存函数的介绍

    strlen size_t strlen ( const char * str ); 字符串已经 ‘\\0’ 作为结束标志,strlen函数返回的是在字符串中 ‘\\0’ 前面出现的字符个数(不包含 ‘\\0’ )。 参数指向的字符串必须要以 ‘\\0’ 结束。 注意函数的返回值为size_t,是无符号的( 易错 ) 代码演示: 运行结果: strcpy char* s

    2024年02月16日
    浏览(42)
  • C/C++字符函数和字符串函数详解————内存函数详解与模拟

    个人主页:点我进入主页 专栏分类:C语言初阶      C语言程序设计————KTV       C语言小游戏     C语言进阶 C语言刷题 欢迎大家点赞,评论,收藏。 一起努力,一起奔赴大厂。 目录 1.前言 2 .memcpy函数 3.memmove函数 4.memset函数  5.memcmp函数            前面学习了关

    2024年02月08日
    浏览(57)
  • C语言进阶---字符串+内存函数

    重点介绍处理字符和字符串的库函数的使用和注意事项。 求字符串长度 strlen() 长度不受限制的的字符串函数 strcpy() strcat() strcmp() 长度受限制的的字符串函数 strncpy() strncat() strncmp() 字符串查找 strstr() strtok() 错误信息报告 strerror() 字符操作 内存操作函数 memcpy() memmove() memset(

    2024年02月12日
    浏览(53)
  • 金丹三层 —— 内存函数和字符串操作函数详解

    目录 一.修炼必备 二.字符串操作的常用函数 2.1 strlen()函数 2.2 strcpy()函数 2.3 strcat()函数 2.4 strcmp()函数 2.5 strstr()函数 2.6 strtok()函数 2.7 strerror()函数 三.内存操作的常用函数 3.1 memcpy()函数 3.2 memmove()函数 3.3 memcmp()函数 结语 1.入门必备:VS2019社区版,下载地址:Visual Studio 较旧的

    2023年04月08日
    浏览(49)
  • 【C语言】字符函数与字符串函数以及内存函数 { 超详细攻略,一篇学会 }

    今日分享:字符、字符串函数和内存函数 内存函数 就是对内存进行操作的函数 字符串函数 就是对字符串进行操作的函数 字符函数 就是对字符进行操作的函数 str 前缀的函数是字符串函数,头文件string.h mem 前缀的函数是内存函数,头文件stdlib.h 字符分类函数包含在 ctype.h 头

    2024年03月18日
    浏览(60)
  • 进阶C语言——字符串和内存函数

    今天我们学点库函数 字符函数和字符串函数 求字符串长度函数-strlen strlen需要的头文件是string.h ,那它的作用是什么呢?? 他是来求字符串长度的,统计的是’\\0’前的字符串长度 size_t是无符号的意思 学会了strlen函数怎么使用,那我们现在模拟实现一下strlen 之前讲过三种方

    2024年02月16日
    浏览(52)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包