C语言:strlen()函数易错点

本文详细解析了C语言中strlen函数的工作原理,包括如何正确使用它来获取字符串长度,以及针对不同初始化方式的注意事项。通过实例演示,帮助开发者避免常见错误并提升编程效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

<pre name="code" class="cpp">/*
	strlen函数解析
*/
# include<stdio.h>
# include<malloc.h>
# include<string.h>

int main(void)
{
	char * c1 = "AbSjhhss";
	int len1 = strlen(c1);
	printf("len1 = %d\n", len1);     //len1 = 8

	char c2[] = {'a', '4', 'r', 't', 'd'};
	int len2 = strlen(c2);
	printf("len2 = %d\n", len2);    //..error..len2 = 9

	char c3[] = {'a', '4', 'r', 't', 'd', '\0'};
	int len3 = strlen(c3);
	printf("len3 = %d\n", len3);   //len3 = 5

	char c4[10] = "AbS";
	int len4 = strlen(c4);
	printf("len4 = %d\n", len4);   //len4 = 3 

	char c5[4];
	int len5 = strlen(c5);
	printf("len5 = %d\n", len5);  //len5 = 5
/*
	c5[0] = '\0';
	len5 = strlen(c5);
	printf("len5 = %d\n", len5);  //len5 = 0
*/
	c5[4] = '\0';
	len5 = strlen(c5);
	printf("len5 = %d\n", len5);  //len5 = 4

	return 0;
}

/*
	总结:如果字符数组,
	   1.用字符串(双引号"")初始化,用strlen函数可以求出该字符串的长度
	   2.用字符数组的形式({'',''})初始化,必须在最后面添加一个元素'\0'才可以。

	所以:strlen() 从字符数组首地址开始,一直找下去,直到遇到'\0'才停止
*/




                
### C语言考试常见易错总结 #### 一、指针与内存管理 指针和内存管理是C语言中的核心部分,但在实际应用中也最容易出现问题。如果未正确理解指针的概念以及动态内存分配的方式,则可能导致程序运行异常或内存泄漏等问题[^2]。 以下是几个典型的错误场景: 1. **野指针**:当一个指针被声明后没有初始化或者指向已释放的内存区域时,该指针被称为“野指针”。访问这样的指针可能会引发不可预测的行为。 ```c int *p; *p = 10; // 错误:p未初始化即赋值 ``` 2. **内存泄漏**:通过`malloc()`或其他函数申请了一块堆空间却忘记调用`free()`来释放它,这会造成资源浪费并最终耗尽可用内存。 3. **越界读写**:尝试操作超出数组边界的数据会破坏其他变量甚至覆盖重要的控制结构信息。 #### 二、字符串处理 在处理字符串的过程中存在多种潜在风险: 1. 使用`sprintf`系列函数时需注意缓冲区大小以免溢出。例如下面的例子展示了如何安全地逆序打印整数而不会造成栈溢出的风险[^3]: ```c #include <stdio.h> #include <string.h> int main(){ int n=0; scanf("%d",&n); char buf[100]; snprintf(buf,sizeof(buf),"%d",n); /* 安全版本 */ size_t len=strlen(buf); while(len--){ putchar(buf[len]); } return 0; } ``` 2. 字符串结束标志`\0`的重要性常常被忽略,在拼接或复制过程中遗漏此标记将导致后续逻辑混乱。 #### 三、循环条件设置不当 不恰当设定for/while语句里的终止条件可能引起死循环或是提前退出的情况发生。比如计算阶乘时初始因子应设为1而非零;另外还要警惕浮比较带来的精度误差影响判断准确性。 #### 四、宏定义滥用 过度依赖预处理器指令虽然可以简化某些重复性的代码片段书写工作量,但如果参数未经括号保护则可能出现意想不到的结果。因此建议总是把所有参与运算表达式的成分都加上额外的一层圆括弧包裹起来以防万一。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值