2025-03-10 学习记录--C/C++-C语言 易错点 大总结
C
语言 易错点 大总结
一、strlen(strs)
使用错误 ⭐️
-
若
strs
是一个指针数组(const char* strs[]
),则不可用strlen(strs)
计算strs
的长度,因为strlen
是用于计算 字符串 的长度,而不是数组的长度。 -
解决方法 🐯:使用
sizeof(strs) / sizeof(strs[0])
来计算 数组 的长度。
#include <stdio.h> // 包含标准输入输出库,用于使用 printf 函数
#include <string.h> // 包含字符串处理库,用于使用 strlen 函数
int main() {
// 定义一个常量字符指针数组,存储星期名称
const char *strs[] = {"Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"};
// 计算数组的长度(元素个数)
// sizeof(strs) 返回整个数组的字节大小
// sizeof(strs[0]) 返回数组中单个元素(即一个指针)的字节大小
// sizeof(strs) / sizeof(strs[0]) 计算数组的元素个数
int right_len = sizeof(strs) / sizeof(strs[0]); // 7
// 错误的使用:strlen(strs)
// strlen 用于计算字符串的长度(字符个数),但 strs 是一个指针数组,不是字符串
// 这里的行为是未定义的,可能会返回一个错误的值
int wrong_len = strlen(strs); // 5(未定义行为,结果不可靠)
// 打印正确长度和错误长度
printf("%d %d", right_len, wrong_len);
return 0; // 程序正常结束
}
1、代码运行结果 ☁️
right_len
的值是7
,因为strs
数组有7
个元素。wrong_len
的值是未定义的,因为strlen(strs)
的行为是错误的。在某些环境下,它可能会返回5
,但这并不是可靠的结果。
2、关键点总结 📚
sizeof(strs) / sizeof(strs[0])
:🦋- 用于计算数组的元素个数。
- 这是正确的方式。
strlen(strs)
:🦋- 错误的使用方式,因为
strs
是一个指针数组,而不是字符串。 strlen
只能用于以\0
结尾的字符串。
- 错误的使用方式,因为
- 未定义行为:
strlen(strs)
的结果是不可靠的,可能会导致程序崩溃或返回错误的值。
3、注意事项 💥
若需要计算字符串数组的长度,请使用
sizeof(strs) / sizeof(strs[0])
,而不是strlen
。🌈
- 若想求某个字符串的长度(例如
strs[0]
),可以使用strlen(strs[0])
,例如:👇🏻
int sunday_len = strlen(strs[0]); // 计算 "Sunday" 的长度,结果为 6
二、const char* strs[]
⭐️
const char* strs[]
是一个 常量字符指针数组 的定义。❀
1、const char*
-
const char*
表示一个指向常量字符的指针。 -
const
表示指针指向的内容是常量,不能被修改。 -
例如: 👇🏻
const char* str = "Hello";
这里,str
是一个指向字符串常量 “Hello
” 的指针,不能通过 str
修改 “Hello
” 的内容(例如 str[0] = 'h';
是非法的)。
2. strs[]
-
strs[]
表示一个数组,数组的每个元素都是const char*
类型。 -
例如: 👇🏻
const char* strs[] = {"Hello", "World"};
-
这里,
strs
是一个数组,包含两个元素:-
strs[0]
是指向字符串常量"Hello"
的指针。 -
strs[1]
是指向字符串常量"World"
的指针。
-
3. const char* strs[]
的含义
-
const char* strs[]
定义了一个数组,数组的每个元素都是一个指向常量字符串的指针。 -
这种定义通常用于存储一组固定的字符串常量(例如星期名称、月份名称等)。
-
例如: 👇🏻
const char* strs[] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};
这里,strs
是一个包含 7
个元素的数组,每个元素都是一个指向星期名称的指针。
4. 为什么用 const
?
-
使用
const
是为了确保字符串内容不会被意外修改。 -
如果你尝试修改
strs
中的字符串内容,编译器会报错。 -
例如: 👇🏻
strs[0][0] = 's'; // 错误:不能修改常量字符串
5. strs
的内存布局
-
strs
是一个指针数组,每个元素指向一个字符串常量。 -
内存布局如下:
strs[0] -> "Sunday"
strs[1] -> "Monday"
strs[2] -> "Tuesday"
...
strs[6] -> "Saturday"
6、总结:
-
const char* strs[]
是一个常量字符指针数组,用于存储一组固定的字符串常量。 -
使用
const
可以防止字符串内容被意外修改。 -
这种定义非常适合用于存储固定的字符串集合(例如星期名称、月份名称等)。
三、字符串比较错误 ⭐️
- 若
strs
是一个指针数组(const char* strs[]
),则不可直接用if(strs[i] == s)
来比较字符串内容,因为if(strs[i] == s)
是比较指针地址,而不是字符串内容。即使两个字符串内容相同,它们的地址也可能不同。 - 解决方法:使用 strcmp 函数来比较字符串内容。
裁判测试程序样例:
#include <stdio.h>
#include <string.h>
#define MAXS 80
int getindex( char *s );
int main()
{
int n;
char s[MAXS];
scanf("%s", s);
n = getindex(s);
if ( n==-1 ) printf("wrong input!\n");
else printf("%d\n", n);
return 0;
}
/* 你的代码将被嵌在这里 */
输入样例1:
Tuesday
输出样例1:
2
输入样例2:
today
输出样例2:
wrong input!
代码(C
语言)⭐️
int getindex(char *s) {
// 检查输入是否为空
// 如果传入的指针 s 是 NULL,直接返回 -1 表示无效输入
if (s == NULL) {
return -1;
}
// 定义一个常量字符指针数组,存储星期名称
// strs 是一个数组,每个元素是一个指向字符串常量的指针
const char *strs[] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};
// 计算数组的长度(元素个数)
// sizeof(strs) 返回整个数组的字节大小
// sizeof(strs[0]) 返回数组中单个元素(即一个指针)的字节大小
// sizeof(strs) / sizeof(strs[0]) 计算数组的元素个数
int len = sizeof(strs) / sizeof(strs[0]); // 7
// 遍历数组,查找匹配的字符串
for (int i = 0; i < len; i++) {
// 使用 strcmp 比较 strs[i] 和 s 的内容
// strcmp 返回 0 表示两个字符串相等
if (strcmp(strs[i], s) == 0) {
return i; // 找到匹配,返回当前索引 i
}
}
// 如果遍历完数组仍未找到匹配的字符串,返回 -1 表示未找到
return -1; // 未找到匹配
}
C
库函数strcmp()
:比较字符串大小,请查看我的另一篇文章。
四、改进点总结:⭐️
-
正确计算数组长度:使用
sizeof(strs) / sizeof(strs[0])
计算数组长度。 -
正确比较字符串:使用
strcmp
比较字符串内容。 -
处理空指针:在函数开头检查
s
是否为NULL
。