C语言字符串操作:手写strlen+常用库函数解析
今天跟着教程学了C语言字符串的几个核心操作,从手写 strlen 到理解 strcmp 、 strncpy ,整理一下笔记~
一、自己实现strlen:统计字符串长度
strlen 是用来计算字符串有效字符数(不包含结束符 \0 )的库函数,先试着自己写一个 my_strlen :
#include <stdio.h>
#include <assert.h> // 用于assert断言
// 实现strlen:统计字符串长度
size_t my_strlen(const char* str)
{
assert(str != NULL); // 断言:防止传入空指针(debug模式下触发)
// 注:这里的if(str==NULL)其实可以去掉,因为assert已经拦截了
size_t count = 0;
while (*str != '\0') // 遍历到结束符停止
{
count++;
str++; // 指针后移
}
return count;
}
int main()
{
const char *a = "abcde";
int len = my_strlen(a);
printf("%d\n", len); // 输出5("abcde"共5个字符)
return 0;
}
图例:

注意点:
- const char* str :加 const 是为了保证函数不会修改传入的字符串;
- assert(str != NULL) :如果传了空指针,debug模式下会直接报错(比if判断更严格);
- size_t 是无符号整数类型,专门用来表示长度/大小。
二、strcmp:字符串比较
strcmp 是比较两个字符串的库函数,规则是按ASCII码逐字符比较:
- 返回值 < 0:前字符串更小;
- 返回值 > 0:前字符串更大;
- 返回值 = 0:两个字符串相等。
示例代码(注释里的写法):
#include <string.h> // strcmp需要的头文件
int main()
{
char arr1[] = "abcde";
char arr2[] = "abcdefg";
int ret = strcmp(arr1, arr2);
// "abcde"比"abcdefg"短,比较到第6位时arr1是'\0',所以ret<0
printf("%d ", ret);
return 0;
}
三、strncpy:指定长度的字符串拷贝
strncpy 是安全版的字符串拷贝(避免 strcpy 的越界风险),第三个参数是“最多拷贝的字符数”。
示例代码:
#include <string.h>
int main()
{
char arr[20] = { 0 }; // 目标数组,提前开好足够空间
char at[] = "abcd";
// 把at的前3个字符拷贝到arr中
char *p = strncpy(arr, at, 3);
printf("%s\n", p); // 输出"abc"
printf("%s\n", arr); // 输出"abc"(arr剩余位置是'\0')
return 0;
}
图例:

注意:如果源字符串长度 < 拷贝长度, strncpy 会把剩余位置补 '\0' 。
今日总结:
今天搞懂了3个字符串操作的核心逻辑:
1. strlen :遍历到 '\0' 统计字符数;
2. strcmp :逐字符比ASCII码;
3. strncpy :指定长度拷贝更安全。
