字符串函数(2)<C语言>

前言

快一周没更博客了,最近有点忙,今天闲下来了,还是不行,继续干,书接上回继续介绍字符串函数:strncpy()、strncat()、strcmp()、strtok()使用、strstr()使用以及模拟实现、strerror()使用。


strncpy()、strncat()、strncmp()

这几个函数看着很眼熟,用法确实和前文的函数类似,不同的是多出了一个n,也有一些不同。

strncpy()

函数参数及其返回类型:

cpp 复制代码
char* strncpy(char* destination , const char* source , size_t num);
//返回值是目的字符串的起始地址

作用:

从源字符串中拷贝num个字符串到目的字符串中。

注意点:

①如果num大于源字符长度,在拷贝完源字符串后,在目标字符串中追加**\0**,直到num个。

②如果num小于源字符长度,在拷贝完指定字符串后,不会在目标字符串中追加**\0**。

使用举例:

strncat()

函数参数及其返回类型:

cpp 复制代码
char* strncat(char* destination , const char* source , size_t num);
//返回值是目的字符串的起始地址

作用:

从源字符串中追加前num个字符串到目的字符串中,再追加个**\0。**

注意点:

①如果num大于源字符长度,只会将源字符串中到**\0**的字符串追加到目的字符串末尾。

②相较于strcat()函数,strncat()可实现自追加(先用strlen()函数求出字符串长度,再追加),原因也很简单,strncat()每次追加完毕会自动追加一个**\0。**

使用举例:

strncmp()

函数参数及其返回类型:

cpp 复制代码
int strncat(const char* str1, const char* str2 , size_t num);
//返回值是大于:大于0的数、等于:0、小于:小于0的数

作用:

比较str1与str2前num个字符

**注意点:**无

使用举例:


strtok()使用

函数参数及其返回类型:

cpp 复制代码
char* strtok(char* str, const char* sep );
//返回值是指向找到以sep中的字符分隔的字符串的首地址,如果没找到返回NULL

作用:

找到第一次以sep字符串中的字符分隔的字符串的首地址

注意点:

①sep参数中定义了分隔字符串的集合,也就是说可以为多个分隔字符且可以无序

②当找到第一个以sep中字符分隔的字符串时,将分隔字符以**\0**替代(strtok()函数会改变源字符,所以一般会使用一个临时变量来接收,不改变源字符)

③strtok()函数具有记忆性(含有static关键字),所以当多次调用strtok()函数时,可将多个字段打印出来

④如果找不到以sep字符串中的字符分隔的字符串,就返回NULL

⑤strtok()函数第一个参数为NULL时,函数将在同一个字符保存的位置找下一个字段

使用举例:

cpp 复制代码
//strtok()函数举例
#include<string.h>
int main() {
	char str[20] = "192.91.89.7";//以"."分隔的字符串
	char* sep = ".";//分隔字符(可以为多个)
	char* ret = NULL;
	for (ret = strtok(str, sep); ret != NULL;ret=strtok(NULL,sep))
	//初始化表达式只执行一次,取出第一个字段:ret = strtok(str, sep)
	//条件表达式用于判断是否为NULL,为NULL则找不到了:ret != NULL
	//更新表达式用于查找下一个字段,第一个参数为NULL时,会从上一次分隔位置查找:ret=strtok(NULL,sep)
		printf("%s\n", ret);
	return 0;
}

运行结果:


strstr()使用以及模拟实现

函数参数及其返回类型:

cpp 复制代码
char* strstr(const char* str1, const char* str2 );
//返回值是在str1中第一次出现str2字符串的首地址,如果没找到返回NULL

作用:

在str1中找str2字符串首次出现的位置

使用举例:

模拟实现:

cpp 复制代码
#include<assert.h>
char* my_strstr(const char* str1, const char* str2) {
	assert(str1 && str2);
	const char* s1 = NULL;
	const char* s2 = NULL;
	const char* cur = str1;//cur直接指向str1
	while (*cur) {
		s1 = cur;//s1指向cur
		s2 = str2;//s2变量用来指向str2
		while (*s1 && *s2 && *s1 == *s2) {
		//当s1和s2不为\0时继续找:*s1 && *s2 
		//满足条件找下一对字符:*s1 == *s2
			s1++;
			s2++;
		}
		if (!*s2) {//取反操作判断是否为\0,为\0说明s2对应到最后一个字符,跳出循环了
			return cur;
		}
		cur++;
		//cur自增,当一次不满足时,使指向cur的s1跳到下一个字符继续匹配
	}
	return NULL;
	//指向str1的cur自增到str1的最后一个字符,还没匹配成功,说明找不到了,返回NULL
}
//strstr()函数模拟实现
int main() {
	char str2[100] = "ABC";
	char str1[100] = "HJKANUABCENNS";
	char* str;
	str = my_strstr(str1, str2);
	printf("%s", str);
	return 0;
}

运行结果:


strerror()

函数参数及其返回类型:

cpp 复制代码
char* strerror(int errornum);
//返回值是整型数字errornum对应的错误码信息首地址

作用:

strerror()函数可以把参数部分对应的错误码返回

注意点:

简单来说,在C语言编译器上规定了一些错误码(如栈溢出:strack overflew),一般存放在error.h头文件中,当C语言程序启动时,会使用全局变量errno来记录当前错误码的地址。

errno是一个全局变量用来存放错误码。

使用举例:

cpp 复制代码
#include<string.h>
int main() {
	int i;
	for (i = 0; i < 10; i++) {
		printf("%s\n", strerror(i));
		//打印前10条错误码,其中错误码0为无错
	}
	return 0;
}

运行结果:

值得注意的是使用perror()函数可以直接将当前错误码打印出来(括号内为提示信息,可不传参)

相关推荐
余衫马3 分钟前
Rust-Trait 特征编程
开发语言·后端·rust
monkey_meng6 分钟前
【Rust中多线程同步机制】
开发语言·redis·后端·rust
Jacob程序员8 分钟前
java导出word文件(手绘)
java·开发语言·word
懒大王就是我14 分钟前
C语言网络编程 -- TCP/iP协议
c语言·网络·tcp/ip
小白学大数据15 分钟前
正则表达式在Kotlin中的应用:提取图片链接
开发语言·python·selenium·正则表达式·kotlin
VBA633717 分钟前
VBA之Word应用第三章第三节:打开文档,并将文档分配给变量
开发语言
半盏茶香17 分钟前
【C语言】分支和循环详解(下)猜数字游戏
c语言·开发语言·c++·算法·游戏
小堇不是码农23 分钟前
在VScode中配置C_C++环境
c语言·c++·vscode
落落鱼201329 分钟前
tp接口 入口文件 500 错误原因
java·开发语言
镰刀出海33 分钟前
Recyclerview缓存原理
java·开发语言·缓存·recyclerview·android面试