首页 >> 常识经验 >

str 函数用法 c 语言 字符串库函数详解

2026-11-12 20:44:26 来源:网易 用户:刘强之 

c 语言里面 str 开头的函数都属于 string.h 头文件下的字符串处理函数,大家习惯统称 str 函数,核心结论就是这类函数专门用来处理以 \0 作为结束标记的字符数组也就是 C 风格字符串,使用之前必须引入头文件 string.h,最常用的包含 strlen strcpy strcat strcmp strstr strchr strrev 等,很多初学者容易混淆这些函数的返回值,还经常忘记字符串末尾的 \0,造成越界访问内存崩溃,这也是 c 语言编程笔试非常高频的考点。学习 str 函数的时候,要分清每一个函数的功能 参数含义 返回值,同时理解底层原理,所有 str 函数都是依靠识别 \0 来判断字符串结束,一旦传入没有 \0 的字符数组,函数就会持续向后读取内存,产生未定义错误。

常用 str 函数分项讲解

strlen

功能 获取字符串有效长度,统计 \0 之前字符个数,不把结束符 \0 算入长度

参数 传入字符串首地址 char 指针

返回值 size_t 类型无符号整数

注意点 size_t 是无符号类型,做减法的时候容易出现隐式转换坑,比如 strlen a 减 strlen b 不会得到负数

strcpy

功能 把源字符串完整复制到目标内存空间,包含末尾 \0

参数 目标首地址 源字符串首地址

返回值 返回目标内存的首指针

注意点 目标缓冲区必须足够大,否则内存溢出,新版推荐使用 strncpy 做长度限制

strcat

功能 字符串拼接,把源字符串接到目标字符串末尾,并且自动写入新的 \0

参数 目标首地址 源字符串首地址

返回值 返回目标字符串首指针

注意点 目标原有字符串末尾必须存在 \0,目标缓冲区容量要能容纳拼接之后全部字符

strcmp

功能 按 ASCII 码逐位比较两个字符串大小

参数 两个待比较字符串首地址

返回值 相等返回 0,第一个串大于第二个返回正数,第一个串小于第二个返回负数

注意点 不是比较字符串长度,是逐字符 ASCII 对比,这个是最常见易错点

strstr

功能 在主字符串里面查找子串第一次出现的位置

参数 主串首地址 待查找子串首地址

返回值 找到就返回子串起始指针,找不到返回空指针 NULL

strchr

功能 在字符串里面查找指定字符第一次出现位置

参数 字符串首地址 待查找字符

返回值 找到返回该字符指针,找不到返回 NULL

核心函数对照表

函数名 核心功能 返回值 头文件 关键风险

strlen 求字符串长度 size_t string.h 无符号类型坑

strcpy 字符串复制 char 指针 string.h 缓冲区溢出

strcat 字符串拼接 char 指针 string.h 缓冲区溢出

strcmp 字符串比较 int 整数 string.h 不是比长度

strstr 查找子串 char 指针 string.h 空指针判断

strchr 查找单字符 char 指针 string.h 空指针判断

编程使用要点清单

第一 使用全部 str 函数之前,代码开头必须写 include string.h,不引入头文件部分编译器会警告或者报错

第二 所有 str 函数操作的字符串必须以 \0 结尾,普通字符数组如果没有手动添加 \0,不能直接传给 str 函数

第三 strcpy strcat 属于不安全函数,实际项目优先选择带长度限制版本 strncpy strncat,防止缓冲区溢出

第四 返回指针的 str 函数,拿到返回值之后要判断是否为 NULL,不要直接解引用

第五 size_t 是无符号数,strlen 返回值不要直接和负数比较,否则会触发隐式类型转换 bug

【常见问题】

问题 1 c 语言 str 函数为什么都要包含 string.h 头文件

回答 1 c 语言 str 函数全部声明在 string.h 当中,使用 str 函数的时候引入这个头文件,编译器才能识别函数原型,否则会出现隐式声明警告。

问题 2 c 语言 str 函数里面 strcmp 是比较字符串长度吗

回答 2 c 语言 str 函数中的 strcmp 并不是比较字符串长度,它是按照 ASCII 码逐个字符对比,根据字符大小返回正负值或者 0。

问题 3 c 语言 str 函数 strlen 会统计末尾的 \0 吗

回答 3 c 语言 str 函数里的 strlen 只统计 \0 之前有效字符,不会把字符串结束标记 \0 计入最终返回的长度数值。

【免责申明】

本文内容仅作为 c 语言 str 函数学习参考,不同编译器标准实现细节存在差异,工程开发请遵循对应 c 标准规范,实际项目编码优先考虑内存安全。

 

相关阅读

最新文章