C语言字符函数和字符串函数的详解

字符转换函数

头文件是 ctype.h

具体使用大家可去参考官方文档

字符串函数

字符串函数头文件是string.h

strlen

strlen 函数是计算某个字符串的长度,遇到 \0 就会停止计算

使用起来也是很方便,就是闯入一个字符串的地址:

模拟实现:注意遇到 \0 就会停止计算就可以写出来了:

方法一(使用计数器)

int my_strlen(const char* str)
{
	assert(str);
	int count = 0;
	while (*str != '\0')
	{
		str++;
		count++;
	}
	return count;
}

递归

//递归
int my_strlen(const char* str)
{
	assert(str);
	if (*str == '\0')
	{
		return 0;
	}
	else
	{
		return 1 + my_strlen(str + 1);
	}
}

指针运算

int my_strlen(const char* str)
{
	assert(str);
	char* tmp = str;
	while (*str)
	{
		str++;
	}
	return str - tmp;
}

strcpy

strcpy是一个字符串拷贝函数,通过官方文档,我们可以看到外面需要传入两个地址,一个是拷贝的地址,另一个是被拷贝的地址,注意源头和目标空间的位置就可以了。

注意了,要做保证目标空间足够大,否则会拷贝溢出!

简单使用一下:

模拟实现:

char* my_strcpy(char* dest, const char* sour)
{
	assert(dest && sour);
	char* tmp = dest;
	while (*dest++ = *sour++)
		;
	return tmp;
}

strcat

这是一个字符串连接函数,就是把一个字符串连接到另一个字符串的末尾(\0开始覆盖)

使用一下:

模拟实现:

char* my_strcat(char* dest, const char* sour)
{
	assert(dest && sour);
	char* tmp = dest;
	while (*dest != '\0')
	{
		dest++;
	}
	while (*dest++ = *sour++)
		;
	return tmp;
}

strcmp

strcmp 是比较两个字符串的函数。现在来看一下它的返回参数:

strcmp 函数是一个字符一个字符来比较,如果出现某个字符的ASCLL码值不一样,就会进行相应的参数返回,当两个字符串大小是一样的,就会返回0.

使用示例:

模拟实现:
当*p1==*p2 的时候继续比较,直到有一方找到了 \0,就说明两个字符串是完全相等的,这时返回 0

int my_strcmp(const char* p1, const char* p2)
{
	assert(p1 && p2);
	while (*p1 == *p2)
	{
		if (*p1 == '\0')
		{
			return 0;
		}
		p1++;
		p2++;
	}
	return *p1 - *p2;
}

strncpy

这个和strcpy 的区别就是它可以控制拷贝多少个字符。

如果要拷贝的字符数大于源头的字符数的话,应该怎么拷贝呢?

如果超过源头字符长度,多的按 \0 来填充。

如果没有超过源字符串,没有到 \0,他是不会把 \0 加进去的!!!

模拟实现:

char* my_strncpy(char* dest, const char* sour, size_t num)
{
	char* tmp = dest;
	while (num != 0 && *sour != '\0')
	{
		*dest++ = *sour++;
		num--;
	}
	while (num != 0)
	{
		*dest++ = '\0';
		num--;
	}
	return dest;
}

strncat

strncat 可以指定连接源头sour 的几个字符。

如果连接超过字符串的长多的话,不会继续填充的

使用一下:

模拟实现:
先找到dest 的字符串结束标志 \0,然后一 一拷贝

char* my_strncat(char* dest, const char* sour, size_t num)
{
	assert(dest && sour);
	char* tmp = dest;
	while (*dest != '\0')
	{
		dest++;
	}
	while (num != 0 && (*dest++ = *sour++))
	{
		num--;
	}
	return dest;
}

strncmp

strncmp 指定比较的字符个数,其他使用和strcmp没有多大的区别

模拟实现:

int my_strncmp(const char* p1, const char* p2, size_t num)
{
	assert(p1 && p2);
	num--;
	while (num  && (*p1 == *p2))
	{
		if (*p1 == '\0')
		{
			return 0;
		}
		p1++;
		p2++;
		num--;
	}
	return *p1 - *p2;
}

这里要注意num需要先减一,因为num 到 0 才会停止循环,不减一就会引起多比较一个字符!!!

strstr

strstr 是字符查找函数,在 str1 里面找 str2,如果找到了就返回找到的 str2 的第一个首字符的地址,否则返回NULL。

使用一下:

模拟实现:

实现这个函数功能的时候,我们要注意在发现str1有一个字符和str2 相等的时候,我们需要进入循环来遍历 str2 的字符串,当str2 成功走到 \0 的时候,才算找完,否则需要再次寻找,并且要注意 str1 的指针指向,要保证str1 回到原先的位置,在走向下一个位置,这就需要一个临时变量来保存,同时也要保证 str2 要回到初始位置,也可以使用临时变量来保存。

char* my_strstr(const char* str1, const char* str2)
{
       assert(str1 && str2);
	char* p1, *p2;
	while (*str1 != '\0')
	{
		p1 = (char*) str1;
		p2 = (char*) str2;
		while (*str1 == *str2)
		{
			str1++;
			str2++;
			if (*str2 == '\0')
			{
				return p1;
			}
		}
		str2 = p2;
		str1 = p1;
		str1++;
	}
	return NULL;
}

strtok

strtok 实际上就是一个分隔函数,delimiters 是分隔符,在函数运行时,就会分割字符串,就是分隔符去掉,每调用一次就会去掉一个分隔符。
在函数调用时,第一次需要传一个字符串地址,随后只需要传空指针就可以了!

使用一下:

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

int main()
{
	char arr[] = "2024:3:29:20:49:50";
	char* sep = ":";
	char* ret = NULL;
	for (ret = strtok(arr, sep); ret != NULL; ret = strtok(NULL, sep))
	{
		printf("%s\n", ret);
	}

	return 0;
}

strerror

strerror函数可以把参数部分错误码对应的错误信息的字符串地址返回来。
在不同的系统和C语言标准库的实现中都规定了⼀些错误码,⼀般是放在errno.h这个头文件中说明的,C语言程序启动的时候就会使⽤⼀个全面的变量errno来记录程序的当前错误码,只不过程序启动的时候errno是0,表示没有错误,当我们在使用标准库中的函数的时候发生了某种错误,就会将对应的错误码,存放在errno中,⽽⼀个错误码的数字是整数很难理解是什么意思,所以每⼀个错误码都是有对应的错误信息的。strerror函数就可以将错误对应的错误信息字符串的地址返回。

在使用 strerro 的时候,需要使用到头文件 string.h ,还有 errno.h

总而言之,strerro 可以返回错误的地址,还能打印出错误的信息。

下面是错误的信息码对应的错误信息:

我们来使用一下:
在这里插入图片描述

perror

由于strerror 的使用优点不便,于是我们可以使用 perror

perror函数先打印完参数部分的字符串后,再打印⼀个冒号和⼀个空格,再打印错误信息。

相关推荐

  1. C语言字符函数字符串函数

    2024-03-30 21:36:04       18 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-03-30 21:36:04       19 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-03-30 21:36:04       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-03-30 21:36:04       20 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-03-30 21:36:04       20 阅读

热门阅读

  1. 【C语言】作用域规则

    2024-03-30 21:36:04       21 阅读
  2. MySQL日志——redo log和bin log的刷盘时机详解

    2024-03-30 21:36:04       19 阅读
  3. 乐观锁的简单感悟

    2024-03-30 21:36:04       21 阅读
  4. 【python】一些常用的小脚本

    2024-03-30 21:36:04       20 阅读
  5. 大三实习小菜蛋之document元素节点

    2024-03-30 21:36:04       17 阅读
  6. Express

    Express

    2024-03-30 21:36:04      18 阅读
  7. C++知识点总结(27):链表

    2024-03-30 21:36:04       16 阅读
  8. math模块篇(八)

    2024-03-30 21:36:04       16 阅读
  9. vue 通过插槽来分配内容

    2024-03-30 21:36:04       15 阅读
  10. SQL中添加数据的方式

    2024-03-30 21:36:04       14 阅读