字符串
字符串实际上是使用空字符 \0
结尾的一维字符数组。因此,\0
是用于标记字符串的结束。
int main()
{
//字符串其实是使用空字符\0结尾的一维字符数组
//\0是字符串的结束标志
//常量字符串不需要在末尾添加\0,编译器在初始化数组时会自动在末尾加上\0
char arr1[] = "hello";
//而以字符数组的方式表达字符串时,需要在末尾加上\0
char arr2[] = { 'h', 'e', 'l', 'l', 'o', '\0' };
//打印字符串,%s表示以字符串方式打印
printf("%s\n", arr1);
printf("%s\n", arr2);
return 0;
}
字符串函数
strlen函数
size_t strlen ( const char * str );
注:
- 字符串是以
\0
作为接受标志,strlen函数计算的是\0
前面的字符的个数(不包括\0
)- 参数指向的字符数组一定是要以
\0
结尾- 函数的返回值是
size_t
类型,size_t
表示的是unsigned int
类型,是一个无符号整型(易错)
代码示例
//strlen函数需要引string.h头文件
#include <string.h>
int main()
{
char str[] = "hello";
printf("%d", strlen(str));
return 0;
}
运行结果
5
模拟实现strlen函数
size_t my_strlen(const char* str)
{
int count = 0;
while (*str)
{
count++;
str++;
}
return count;
}
//使用递归
size_t my_strlen1(const char* str)
{
if (!*str)
return 0;
else
return 1 + my_strlen1(str + 1);
}
//使用地址相减的方法
size_t my_strlen2(const char* str)
{
int* p = str;
while (*str)
str++;
return str - p;
}
int main()
{
char str[] = "hello";
printf("%d\n", my_strlen(str));
printf("%d\n", my_strlen1(str));
printf("%d\n", my_strlen2(str));
return 0;
}
运行结果
5
5
5
strcpy函数
char * strcpy ( char * destination, const char * source );
作用:
将源指向的C字符串复制到目标指向的数组中,包括终止的空字符(并在该点停止)。
注:
- 源字符串必须以
\0
结尾- 会将源字符串的
\0
拷贝到目标字符串- 目标字符串的空间一定要能够容纳下源字符串的内容
代码示例
int main()
{
char str1[10] = "hello";
char str2[10] = "world";
//返回值为目标字符串的首地址
char* res = strcpy(str2, str1);
printf("str2 = %s\n", str2);
printf("res = %s\n", res);
return 0;
}
运行结果
str2 = hello
res = hello
模拟实现strcpy函数
char* my_strcpy(char* des, const char* source)
{
//如果为空,程序退出
assert(des);
assert(source);
char* res = des;
while (*des++ = *source++)
;
return res;
}
int main()
{
char str1[10] = "hello";
char str2[10] = "world";
//返回值为目标字符串的首地址
char* res = my_strcpy(str2, str1);
printf("str2 = %s\n", str2);
printf("res = %s\n", res);
return 0;
}
运行结果
str2 = hello
res = hello
strcat函数
char * strcat ( char * destination, const char * source );
作用:
串联字符串,将源字符串的副本附加到目标字符串。目标中终止的空字符将被源的第一个字符覆盖,并且空字符将包含在由目标中的两个字符串联而成的新字符串的末尾
注:
- 源字符串必须以
\0
结束- 目标字符串数组的空间足够容纳串联后的字符串
- 目标字符串必须可修改
代码示例
int main()
{
char str1[20] = "hello";
char str2[10] = "world";
//返回值为目标字符串的首地址
char* res = strcat(str1, str2);
printf("str1 = %s\n", str1);
printf("res = %s\n", res);
return 0;
}
运行结果
str1 = helloworld
res = helloworld
模拟实现strcat函数
char* my_strcat(char* des, const char* src)
{
assert(des);
assert(src);
char* res = des;
while (*des)
des++;
while (*des++ = *src++)
;
return res;
}
int main()
{
char str1[20] = "hello";
char str2[10] = "world";
//返回值为目标字符串的首地址
char* res = my_strcat(str1, str2);
printf("str1 = %s\n", str1);
printf("res = %s\n", res);
return 0;
}
运行结果
str1 = helloworld
res = helloworld
strcmp函数
int strcmp ( const char * str1, const char * str2 );
作用:
比较两个字符串,此函数开始比较每个字符串的第一个字符。如果它们彼此相等,则继续使用以下对,直到字符不同或到达终止的空字符。
返回值
返回一个整数,表示字符串之间的关系:
返回值 | 含义 |
---|---|
<0 | 第一个字符串大于第二个字符串 |
0 | 第一个字符串等于第二个字符串 |
>0 | 第一个字符串小于第二个字符串 |
代码示例
int main()
{
char str1[] = "hello";
char str2[] = "hi";
char str3[] = "hi";
int res1 = strcmp(str1, str2);
int res2 = strcmp(str2, str3);
printf("strcmp(str1, str2): %d\n", res1);
printf("strcmp(str2, str3): %d\n", res2);
return 0;
}
运行结果
strcmp(str1, str2): -1
strcmp(str2, str3): 0
模拟实时strcmp函数
int my_strcmp(const char* str1, const char* str2)
{
assert(str1);
assert(str2);
int res = 0;
while ((res = *str1 - *str2)==0 && *str1)
{
str1++;
str2++;
}
if (res > 0)
return 1;
else if(res < 0)
return -1;
return res;
}
int main()
{
char str1[] = "hello";
char str2[] = "hi";
char str3[] = "hi";
int res1 = my_strcmp(str1, str2);
int res2 = my_strcmp(str2, str3);
printf("my_strcmp(str1, str2): %d\n", res1);
printf("my_strcmp(str2, str3): %d\n", res2);
return 0;
}
显示结果
my_strcmp(str1, str2): -1
my_strcmp(str2, str3): 0
strstr函数
char * strstr ( const char * str1, const char * str2 );
作用:
返回指向str1中首次出现的str2的指针,如果str2不是str1的一部分,则返回空指针。
代码示例
int main()
{
char str[] = "This is a string.";
//返回值为指向str2整个字符串在str1中第一次出现的指针,如果str1中不存在该序列,则为空指针。
char* res = strstr(str, "is");
printf("%c\n", *res);
return 0;
}
模拟实现strstr函数
char* my_strstr(const char* str1, const char* str2)
{
assert(str1);
assert(str2);
char* s1 = str1;
char* s2 = str2;
while (*str1)
{
if (*str1 == *str2)
{
s1 = str1;
while ((*str1 == *str2) && *str1)
{
str1++;
str2++;
}
if (*str2 == 0)
return s1;
str1 = s1;
str2 = s2;
}
str1++;
}
return NULL;
}
int main()
{
char str[] = "This is a string.";
//返回值为指向str2整个字符串在str1中第一次出现的指针,如果str1中不存在该序列,则为空指针。
char* res = my_strstr(str, "b");
if(res)
printf("%c\n", *res);
return 0;
}
本文出现任何错误,欢迎留言批评指正。