字符转换函数
头文件是 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函数先打印完参数部分的字符串后,再打印⼀个冒号和⼀个空格,再打印错误信息。