strlen 注意

没初始化的字符数组就不要strlen
否则会在内存中一直找到0

以下代码会悲剧

str[100];
memset(str,0,strlen(str));



strlen返回时无符号,不要进行运算
一旦负值就会悲剧

if(strlen("123")-5<0)


只比较还是可以的

if(strlen("123")<5)
<think>我们讨论的是C语言中的strlen函数。strlen是C标准库中的一个函数,用于计算字符串的长度,即从起始地址到第一个空字符('\0')前的字符个数(不包括空字符)。 注意细节: 1. 字符串必须以空字符'\0'结尾,否则strlen会继续往后搜索直到遇到'\0',这可能导致未定义行为(如访问越界)。 2. strlen返回的是size_t类型(无符号整数),因此在比较或计算时要注意无符号数的特性(比如当与有符号数比较时可能产生意想不到的结果)。 3. 使用strlen时,要确保传入的指针指向的是一个合法的字符串(即以'\0'结尾的字符数组)。 4. strlen不会计算结尾的'\0'。 5. 由于strlen需要遍历整个字符串直到遇到'\0',所以时间复杂度为O(n)。对于长字符串,频繁调用strlen可能影响性能。 示例代码:展示strlen的用法和注意事项 </think> ### `strlen` 函数的注意细节 `strlen` 是 C 标准库(`<string.h>`)中用于计算字符串长度的函数。其原型为: ```c size_t strlen(const char *str); ``` 以下是关键注意事项及代码示例: --- #### **1. 字符串必须以 `\0` 结尾** `strlen` 从起始地址开始扫描,直到遇到第一个 `\0` 结束。若字符串未以 `\0` 结尾,会导致**未定义行为**(内存越界访问)。 ```c #include <stdio.h> #include <string.h> int main() { char bad_str[3] = {'a', 'b', 'c'}; // 未以 \0 结尾 size_t len = strlen(bad_str); // 危险!可能访问非法内存 printf("Length: %zu\n", len); // 输出不可预测 return 0; } ``` --- #### **2. 返回值类型是 `size_t`(无符号整数)** 比较或计算时需注意无符号数的特性: ```c #include <stdio.h> #include <string.h> int main() { if (strlen("hello") - 10 > 0) { // 无符号数减法不会为负 printf("This will ALWAYS print!\n"); } return 0; } ``` --- #### **3. 不计算结尾的 `\0`** `strlen` 返回 `\0` 之前的字符数: ```c #include <stdio.h> #include <string.h> int main() { char str[] = "abc"; // 实际存储: 'a','b','c','\0' printf("Length: %zu\n", strlen(str)); // 输出 3 (不是 4) return 0; } ``` --- #### **4. 空字符串返回 0** 若传入空字符串(仅含 `\0`),返回值为 `0`: ```c #include <stdio.h> #include <string.h> int main() { char empty[] = ""; printf("Length: %zu\n", strlen(empty)); // 输出 0 return 0; } ``` --- #### **5. 处理用户输入时需谨慎** 若输入未预留 `\0` 的空间,可能破坏字符串终止符: ```c #include <stdio.h> #include <string.h> int main() { char name[5]; // 最多容纳 4 字符 + \0 printf("Enter name: "); scanf("%s", name); // 输入 "Alexandra" 会导致越界 printf("Length: %zu\n", strlen(name)); // 行为未定义 return 0; } ``` --- #### **6. 时间复杂度为 O(n)** 需遍历整个字符串,避免在循环中重复调用: ```c // 低效写法 (时间复杂度 O()) for (size_t i = 0; i < strlen(str); i++) { ... } // 高效写法 (时间复杂度 O(n)) size_t len = strlen(str); for (size_t i = 0; i < len; i++) { ... } ``` --- #### **7. 自定义 `strlen` 实现** 理解原理可避免误用: ```c #include <stddef.h> size_t my_strlen(const char *str) { size_t len = 0; while (*str != '\0') { // 逐字符扫描直到 \0 len++; str++; } return len; } ``` --- ### 关键总结: - **始终确保字符串以 `\0` 结尾** - **注意 `size_t` 的无符号特性** - **预留空间存储 `\0`** - **避免重复调用以优化性能**
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值