strnlen_s
strlen, strnlen_s
在头文件 | | |
---|---|---|
size_t strlen(const char * str); | (1) | |
size_t strnlen_s(const char * str,size_t strsz); | (2) | (自C11以来) |
1)返回给定的以空字符结尾的字节字符串的长度,即字符数组中第一个元素由str指向并且不包含第一个空字符的字符数。
如果str不是指向以空字符结尾的字节字符串的指针,则行为是未定义的。
2)与(1)相同,只是如果str是空指针,则函数返回零,如果在str的第一个strsz字节中未找到空字符,则返回strsz。
如果两个str都指向缺少空字符和该字符数组大小的字符数组,则行为是未定义的<strsz; 换句话说,strsz的错误值不会暴露即将发生的缓冲区溢出。 与所有边界检查函数一样,只有当__STDC_LIB_EXT1__由实现定义并且用户在包含string.h之前将__STDC_WANT_LIB_EXT1__定义为整数常量1时,strnlen_s才能保证可用。
参数
str | - | 指向要检查的以空字符结尾的字节字符串 |
---|---|---|
strsz | - | 最大数量的字符进行检查 |
返回值
1)以空字符结尾的字节串str的长度。
2)成功时以空字符结尾的字节串str的长度,如果str是空指针则返回零,如果未找到空字符,则返回strsz。
注意
strnlen_s
与wcsnlen_s
是不调用运行时约束处理程序的唯一边界检查函数。它们是纯粹的实用函数,用于为非空终止的字符串提供有限的支持。
例
#define __STDC_WANT_LIB_EXT1__ 1
#include <string.h>
#include <stdio.h>
int main(void)
{
const char str[] = "How many characters does this string contain?";
printf("without null character: %zu\n", strlen(str)
printf("with null character: %zu\n", sizeof str
#ifdef __STDC_LIB_EXT1__
printf("without null character: %zu\n", strnlen_s(str, sizeof str)
#endif
}
输出:
without null character: 45
with null character: 46
without null character: 45
参考
- C11标准(ISO / IEC 9899:2011):
扩展内容
wcslenwcsnlen_s(C95)(C11) | 返回一个宽字符串的长度(函数) |
---|---|
mblen | 返回下一个多字节字符(函数)中的字节数 |
|strlen的 C ++文档 |