在C语言中,我们对字符和字符串的使用是非常频繁的,但是C语言本身是没有提供字符串类型的,字符串通常是放在常量字符串或者字符数组中。
需要调用或者使用这一类函数,必不可少的就是要调用其头文件<string.h>。接下来小编就开始着重介绍<string.h>头文件下的各个常用字符和字符串的库函数的使用和注意事项!
目录
1 strlen
1.1函数介绍
函数模型:size_t strlen(const char* str);
函数作用:返回字符串str的长度
1.2注意事项
a) 字符串以 '\0' 作为结束标志,strlen函数返回的是在字符串中 '\0' 前面出现的字符个数(不包含 '\0' )。
b) 参数指向的字符串必须要以 '\0' 结束。
c) 函数的返回值为size_t,是无符号的。
1.3函数模拟实现
#include<stdio.h>
#include<assert.h>
size_t my_strlen(const char* str)
{
assert(str);
size_t count = 0;
while (*str++)
{
count++;
}
return count;
}
int main()
{
char str[] = "abcdef";
size_t ret = my_strlen(str);
printf("%zd", ret);
return 0;
}
2strcpy
2.1函数介绍
函数模型:char* strcpy(char * destination, const char * source );
函数作用:将source所指向的字符串复制到destination所指向的字符串,包括终止字符
2.2注意事项
a)源字符串必须以 '\0' 结束。
b) 会将源字符串中的 '\0' 拷贝到目标空间。
c)目标空间必须足够大,以确保能存放源字符串。
d)目标空间必须可变。 学会模拟实现。
2.3函数模拟实现
#include<stdio.h>
#include<assert.h>
char* my_strcpy(char* destination, const char* source)
{
assert(destination);
assert(source);
while (*destination++ = *source++)
{
;
}
return destination;
}
int main()
{
char str1[20] = { 0 };
char str2[] = "abcdef";
my_strcpy(str1, str2);
printf("%s", str1);
return 0;
}
3strcat
3.1函数介绍
函数模型:char * strcat ( char * destination, const char * source );
函数作用:将源字符串追加到目标字符串。终止字符在目标字符串中被源字符串的第一个字 符覆盖,并且包含终止字符在两者串联而成的新字符串的末尾。
3.2注意事项
a)源字符串必须以 '\0' 结束。
b) 目标空间必须有足够的大,能容纳下源字符串的内容。
c)目标空间必须可修改。
3.3函数模拟实现
#include<stdio.h>
#include<assert.h>
char* my_strcat(char* destination, const char* source)
{
assert(destination);
assert(source);
char* cur = destination;
while (*cur)
{
cur++;
}
while (*cur++ = *source++)
{
;
}
return destination;
}
int main()
{
char str1[20] = "hello ";
char str2[] = "world!";
my_strcat(str1, str2);
printf("%s", str1);
return 0;
}
4strcmp
4.1函数介绍
函数模型:int strcmp ( const char * str1, const char * str2 );
函数作用:此函数开始比较每个字符串的第一个字符。如果它们彼此相等,则继续执行以下一对字符比较,直到字符不同或直到终止字符。
4.2注意事项
a) 第一个字符串大于第二个字符串,则返回大于0的数字。
b)第一个字符串等于第二个字符串,则返回0。
c)第一个字符串小于第二个字符串,则返回小于0的数字。
4.3函数模拟实现
#include<stdio.h>
#include<assert.h>
int my_strcmp(const char* str1, const char* str2)
{
assert(str1);
assert(str2);
while (*str1 != '\0' && *str2 != '\0' && *str1 == *str2)
{
str1++;
str2++;
}
if (*str1 == '\0' && *str2 == '\0')
return 0;
if (*str1 > *str2)
return 1;
else
return -1;
}
int main()
{
char str1[] = "abc";
char str2[] = "abc";
int ret = my_strcmp(str1, str2);
printf("%d", ret);
return 0;
}
5strstr
5.1函数介绍
函数模型:char * strstr ( const char *str1, const char * str2);
函数作用:返回指向 str1 中第一次出现的 str2 的指针,如果 str2 不是 str1 的一部分,则返回空指针。
5.2 函数模拟实现
#include<stdio.h>
#include<assert.h>
char* my_strstr(const char* str1, const char* str2)
{
assert(str1);
assert(str2);
const char* s1 = str1;
const char* s2 = str2;
const char* p = str1;
while (*p)
{
s1 = p;
s2 = str2;
while (*s1 != '\0' && *s2 != '\0' && *s1 == *s2)
{
s1++;
s2++;
}
if (*s2 == '\0')
{
return (char*)p;
}
p++;
}
return NULL;
}
int main()
{
char str1[] = "abcdefabcdefabcdef";
char str2[] = "fabcdefabcdef";
char* ret = my_strstr(str1, str2);
if (ret == NULL)
{
printf("找不到\n");
}
else
{
printf("%s", ret);
}
return 0;
}
6字符分类函数
函数 | 如果它的参数符合下列条件就返回真 |
iscntrl | 任何控制字符 |
isspace | 空白字符:空格‘ ’,换页‘\f’,换行'\n',回车‘\r’,制表符'\t'或者垂直制表符'\v' |
isdigit | 十进制数字 0~9 |
isxdigit | 十六进制数字,包括所有十进制数字,小写字母a~f,大写字母A~F |
islower | 小写字母a~z |
isupper | 大写字母A~Z |
isalpha | 字母a~z或A~Z |
isalnum | 字母或者数字,a~z,A~Z,0~9 |
ispunct | 标点符号,任何不属于数字或者字母的图形字符(可打印) |
isgraph | 任何图形字符 |
isprint | 任何可打印字符,包括图形字符和空白字符 |