C语言-部分字符串函数详解 1-4
- 前言
- 1.`strlen`
- 1.1基本用法
- 1.2注意事项
- `\0`
- `size_t`
- 1.3模拟实现
- 2.`strcpy`
- 2.1基本用法
- 2.2注意事项
- **源字符串必须以 `\0` 结束**
- **会将源字符串中的 `\0`拷贝到目标空间**
- **目标空间必须可修改**
- **目标空间必须能容纳下源字符串的内容**
- 2.3模拟实现
- 3.`strncpy`
- 3.1基本用法
- 3.2注意事项
- **原字符串长度小于`num`会补`0`**
- **原字符串长度长于`num`需手动补`0`**
- 3.3模拟实现
- 4.`strcat`
- 4.1基本用法
- 4.2注意事项
- **从`\0`开始连接,结束时会加`\0`**
- **目标空间必须能容纳下源字符串的内容**
- 4.3模拟实现
前言
本文将介绍<string.h>
头文件下的部分字符串函数:
- 1.
strlen
- 2.
strcpy
- 3.
strncpy
- 4.
strcat
- 5.
strncat
- 6.
strcmp
- 7.
strncmp
- 8.
strstr
- 9.
strtok
- 10.
strerror
1.strlen
函数原型:
size_t strlen ( const char * str );
简介:Get string length
——获取字符串长度
1.1基本用法
char ch[20] = "Hello World!";
size_t len = strlen(ch);
printf("%zd\n", len);
1.2注意事项
\0
strlen
返回的值为字符串开头和'\0'
之间的字符数,因此,如果没有'\0'
,将越界访问,并返回随机值:
char ch1[] = { 'a','b','c' };
char ch2[] = { 'a','b','c','\0' };
size_t len1 = strlen(ch1);
size_t len2 = strlen(ch2);
printf("%zd\n%zd\n", len1,len2);
VS2022也给出了相应的警告:
size_t
返回的是无符号整型,所以别用返回值相减:
char ch1[20] = "Hello";
char ch2[20] = "World!!";
if (strlen(ch1) - strlen(ch2)> 0)
printf(">");
else
printf("<");
1.3模拟实现
这里给出三种方法:
计数器
size_t my_strlen1(const char* p)
{
assert(p);
size_t count = 0;
while (*p)
{
p++;
count++;
}
return count;
}
其中:
assert
断言指针不为空while
在\0
处终止循环
指针-指针
size_t my_strlen2(const char* p)
{
assert(p);
char* start = p;
while (*p)p++;
return p - start;
}
其中:
start
记录起始位置,p
寻找\0
- 指针-指针得到相距的元素个数
递归
原理如图:
size_t my_strlen3(const char* p)
{
assert(p);
if (*p == '\0')return 0;
else return 1 + my_strlen3(p + 1);
}
2.strcpy
函数原型:
char * strcpy ( char * destination, const char * source );
简介:Copy string
——拷贝字符串
2.1基本用法
char ch1[20] = "Hello World!";
char ch2[20];
strcpy(ch2, ch1);
printf(ch2);
2.2注意事项
源字符串必须以 \0
结束
char ch1[] = { 'a','b','c' };
char ch2[20];
strcpy(ch2, ch1);
VS2022给出了相应的警告:
会将源字符串中的 \0
拷贝到目标空间
可简单验证:
char ch1[20] = "Hello World!";
char ch2[20] = "xxxxxxxxxxxxxxxxxx";
strcpy(ch2, ch1);
目标空间必须可修改
char ch1[20] = "Hello World!";
char* ch2 = "xxxxxxxxxxxxxxxxxx";
strcpy(ch2, ch1);
ch2
为指针,指向常量字符串
目标空间必须能容纳下源字符串的内容
char ch1[20] = "Hello World!";
char ch2[1];
strcpy(ch2, ch1);
2.3模拟实现
char* my_strcpy(char* dst, const char* src)
{
assert(dst && src);
char* start = dst;
while (*dst++ = *src++);
return start;
}
其中:
- 当
*src
将\0
赋值给*dst
后,while
循环停止
3.strncpy
函数原型:
char * strncpy ( char * destination, const char * source, size_t num );
简介:Copy characters from string
——从字符串拷贝字符
3.1基本用法
char ch1[] = "Hello World!xxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
char ch2[20];
strncpy(ch2, ch1, 12);
ch2[12] = '\0';
printf(ch2);
3.2注意事项
原字符串长度小于num
会补0
char ch1[] = "Hello World!";
char ch2[20]="xxxxxxxxxxxxxxxxxxxx";
strncpy(ch2, ch1, 15);
原字符串长度长于num
需手动补0
错误示范:
char ch1[] = "Hello World!xxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
char ch2[20];
strncpy(ch2, ch1, 12);
printf(ch2);
VS2022给出了相应的警告:
3.3模拟实现
char* my_strncpy(char* dst, const char* src, size_t num)
{
assert(dst && src);
char* ret = dst;
while (*src && num)
{
*dst++ = *src++;
num--;
}
while (num--)*dst++ = 0;
return ret;
}
4.strcat
函数原型:
char * strcat ( char * destination, const char * source );
简介:Get string length
——连接字符串
4.1基本用法
char ch1[20] = "Hello ";
char ch2[] = "World!";
strcat(ch1, ch2);
printf(ch1);
4.2注意事项
从\0
开始连接,结束时会加\0
char ch1[20] = "x\0xxxxxxxx";
char ch2[] = "aaaaa";
strcat(ch1, ch2);
printf(ch1);
目标空间必须能容纳下源字符串的内容
char ch1[] = "xxxxx";
char ch2[] = "aaaaa";
strcat(ch1, ch2);
printf(ch1);
VS2022给出了相应的警告:
4.3模拟实现
char* my_strcat(char* dst, const char* src)
{
assert(dst && src);
char* start = dst;
while (*dst)dst++;
while (*dst++ = *src++);
return start;
}
希望本篇文章对你有所帮助!
本人仅仅是个C语言初学者,如有任何意见,欢迎各位提出!
相关文章:
C语言指针详解-上
C语言指针详解-下