常用的字符串函数包括了strlen,strcpy,strcmp,strcat,strncpy,strncat,strncmp,strstr
,strtok,strerror
对于它们,我进行了一番总结。
要注意,这些函数的使用包含的头文件是<string.h>
目录
1.strlen
计算字符串的长度并返回其数值
- 字符串以 '\0' 作为结束标志,strlen函数返回的是在字符串中 '\0' 前面出现的字符个数(不包含 '\0' )
- 参数指向的字符串必须要以 '\0' 结束。
- 注意函数的返回值为size_t,是无符号的( 易错 )
1.1使用格式
1.2模拟实现
#include<stdio.h>
size_t my_strlen(char* p);
int main()
{
char arr[100] = { 0 };
int n = 0;
printf("请输入一行字符:");
scanf("%s", arr);
n=my_strlen(arr);
printf("字符串长度为:%d\n", n);
return 0;
}
size_t my_strlen(char* p)
{
int n=0;
while (*p != '\0')
{
n++;
p++;
}
return n;
}
2. strcpy
将源字符串中的内容拷贝到目标空间
- 源字符串必须以 '\0' 结束。
- 会将源字符串中的 '\0' 拷贝到目标空间。
- 目标空间必须足够大,以确保能存放源字符串。
- 目标空间必须可修改
2.1使用格式
2.2模拟实现
#include<stdio.h>
char* my_strcpy(char* p, char* q);
int main()
{
char arr1[100] = { 0 };
char arr2[100] = { 0 };
char *t;
printf("请输入你要复制的字符串arr1:");
scanf("%s", arr1);
t=my_strcpy(arr2, arr1);
printf("arr2=%s\n", arr2);
return 0;
}
char* my_strcpy(char* p,const char* q)
{
char* t;
t = p;
while (*q != '\0')//将q指向字符串中的元素一个一个赋给p
{
*p = *q;
p++;
q++;
}
*p = '\0';//p末尾加'\0'
return t;
}
3. strcmp
根据ASCII码值比较字符串的大小
- 第⼀个字符串大于第二个字符串,则返回大于0的数字
- 第⼀个字符串等于第二个字符串,则返回0
- 第⼀个字符串小于第二个字符串,则返回小于0的数字
3.1使用格式
3.2模拟实现
#include<stdio.h>
#define N 100
int my_strcmp(const char* p, const char* q);
int main()
{
int t = 0;
char arr1[N], arr2[N];
printf("请输入第一串字符:");
scanf("%s", arr1);
printf("请输入第二串字符:");
scanf("%s", arr2);
t = my_strcmp(arr1, arr2);
if (t == 0)
{
printf("arr1 = arr2\n");
}
else if (t > 0)
{
printf("arr1 > arr2\n");
}
else
{
printf("arr1 < arr2\n");
}
return 0;
}
int my_strcmp(char* p, char* q)
{
while (*p != '\0' || *q != '\0')
{
if (*p == *q)
{
p++;
q++;
}
else if (*p > *q)
{
return 1;
}
else {
return -1;
}
}
return 0;
}
4. strcat
字符串拼接函数,将源字符串中的内容追加到目标字符串尾部
- 源字符串必须以 '\0' 结束。
- 目标字符串中也得有 \0 ,否则没办法知道追加从哪里开始。
- 目标空间必须有足够的大,能容纳下源字符串的内容。
- 目标空间必须可修改。
4.1使用格式
4.2模拟实现
#include<stdio.h>
#include<assert.h>
char* my_strcat(char* p, char* q);
int main()
{
char arr1[20]="hello ", arr2[10]="world";
printf("拼接后为:%s\n", arr1);
return 0;
}
char* my_strcat(char* p,const char* q)
{
assert(p);
assert(q);//断言传入的指针是否为空
char* t = p;
while (*p)//找到要追加的字符串结尾的'\0'
{
p++;
}
while (*p++ = *q++);//将q指向的字符串的元素逐个赋值给p
return t;
}
5. strncpy
从源字符串中拷贝num个字符到目标空间
- 如果源字符串的长度小于num,则拷贝完源字符串之后,在目标的后边追加0,直到num个。
5.1使用格式
这里要注意:2代表的是字节数
5.2模拟实现
#include<stdio.h>
char* my_strncpy(char* p, char* q, int n);
int main()
{
char arr1[20] = { "abcdef ghijk" };
char arr2[20] = { "xxxxx" };
my_strncpy(arr1, arr2, 3);
printf("%s\n", arr1);
return 0;
}
char* my_strncpy(char* p, char* q, int n)
{
int i;
for (i = 0; i < n; i++)
{
*(p + i) = *(q + i);
}
return p;
}
6. strncat
从源字符串中追加num个字符到目标空间尾部
- 将source指向字符串的前num个字符追加到destination指向的字符串末尾,再追加⼀个 \0 字符
- 如果source指向的字符串的长度小于num的时候,只会将字符串中到\0 的内容追加destination指向的字符串末尾
6.1使用格式
6.2模拟实现
#include<stdio.h>
char* my_strncat(char* p, const char* q, size_t n);
int main()
{
char arr1[20] = { "abc" };
char arr2[20] = { "xxxxxx" };
my_strncat(arr1, arr2, 3);
printf("%s\n", arr1);
return 0;
}
char* my_strncat(char* p,const char* q, size_t n)
{
int i;
while (*p)
{
p++;
}
for (i = 0; i < n; i++)
{
*(p + i) = *(q + i);
}
*(p + i) = '\0';
}
7. strncmp
比较str1和str2的前num个字符,如果num个字符都相等,就是相等返回0。
7.1使用格式
7.2模拟实现
#include<stdio.h>
int my_strncmp(const char* p, const char* q,size_t n);
int main()
{
int t = 0;
char arr1[20] = "xxcde";
char arr2[20] = "xxx";
t = my_strncmp(arr1, arr2, 2);//比较arr1,arr2的前两个元素
printf("t = %d\n", t);
t = my_strncmp(arr1, arr2, 3);//比较arr1,arr2的前三个元素
printf("t = %d\n", t);
return 0;
}
int my_strncmp(const char* p, const char* q, size_t n)
{
int i=0;
for(i=0;i<n;i++)
{
if (*p == *q)
{
p++;
q++;
}
else if (*p > *q)
{
return 1;
}
else {
return -1;
}
}
return 0;
}
8.strstr
函数返回字符串str2在字符串str1中第⼀次出现的位置
- 字符串的比较匹配不包含 \0 字符,以 \0 作为结束标志
8.1使用格式
8.2模拟实现
#include<stdio.h>
#define N 100
char* my_strstr(const char* p, const char* q);
int main()
{
char* t;
char arr1[N], arr2[N];
printf("请输入第一串字符:");
scanf("%s", arr1);
printf("请输入查找的字符:");
scanf("%s", arr2);
t = my_strstr(arr1, arr2);
if (t == NULL)
{
printf("没找到\n");
}
else
{
printf("%s\n", t);
}
return 0;
}
char* my_strstr(const char* p,const char* q)
{
char* str1, * str2,* t;
str1 = p;
str2 = q;
t = p;
while (*str1)
{
str1=t;//str1从t处开始查询比较
str2 = q;//若未找到,则str2重新回到起点
while (*str1!='\0'&&*str2!='\0'&& * str1 == *str2)
{
str1++;
str2++;
}
if (*str2 == '\0')
{
return t;
}
t++;//将比较对象跳向下一个字符
}
return NULL;
}
9. strtok
字符串剪切函数
- sep参数指向⼀个字符串,定义了用作分隔符的字符集合
- 第⼀个参数指定⼀个字符串,它包含了0个或者多个由sep字符串中⼀个或者多个分隔符分割的标记。
- strtok函数找到str中的下⼀个标记,并将其用 \0 结尾,返回⼀个指向这个标记的指针。(注:strtok函数会改变被操作的字符串,所以在使用strtok函数切分的字符串⼀般都是临时拷贝的内容并且可修改。)
- 返 回 值: 返回值为char * 类型 。如果找到标记,则为指向标记开头的指针。否则为空指针。当在正在扫描的字符串中达到字符串的末尾(即空字符)时,始终返回空指针。
使用格式
10.strerror
返回参数部分错误码对应的错误信息的字符串地址
在不同的系统和C语言标准库的实现中都规定了⼀些错误码,⼀般是放在 errno.h 这个头⽂件中说明的,当我们在使⽤标准库中的函数的时候发生了某种错误,就会讲对应的错误码,存放在errno中,程序启动的时候errno是0,表⽰没有错误。⼀个错误码的数字是整数很难理解是什么意思,所以每⼀个错误码都是有对应的错误信息的。strerror函数就可以将错误对应的错误信息字符串的地址返回。