晚上好🌙🌙🌙
本答案参考通义千问
你提供的代码是用于实现字符串逆序的,但在运行时没有输出,这说明程序可能在执行过程中出现了错误。下面我将详细分析问题,并给出解决方案。
一、问题分析
1. sizeof(str)/sizeof(str[0]) - 2 的计算错误
SZ = sizeof(str)/sizeof(str[0]) - 2;
str 是一个字符数组,大小为 10。sizeof(str) 是 10 * sizeof(char) = 10。sizeof(str[0]) 是 1(因为 char 占 1 字节)。- 所以
sizeof(str)/sizeof(str[0]) = 10。 - 然后减去 2,得到
SZ = 8。
这个计算是不正确的,因为:
sizeof(str) 是整个数组的字节数,而不是字符串长度。
如果用户输入的是 "abc",那么 str 中只有前 4 个字符(包括结尾的 \0),其余为空。
因此,SZ 的值并不等于字符串的实际长度,而是基于数组大小的固定值,导致函数 rev 操作了无效的位置。
2. rev 函数逻辑错误
for(i=0; i < sz - i; i++)
{
char tmp = '0';
tmp = *(p + i);
*(p + i) = *(p + sz - i);
*(p + sz - i) = tmp;
}
- 这个循环条件
i < sz - i 实际上等价于 i < sz / 2。 - 但
sz 是从 main() 传入的,而它不是字符串实际长度,而是 8。 - 更严重的是,
*(p + sz - i) 可能越界访问内存(比如当 sz = 8,i = 0,p + 8 可能已经超出数组边界)。
3. 未正确处理字符串结束符 \0
- 在交换字符时,如果
sz 不是字符串的真实长度,可能会把 \0 也参与交换,导致字符串无法正确打印。
二、正确的做法:使用 strlen 获取字符串长度
为了正确地进行字符串逆序,应该使用 strlen 来获取字符串的长度,而不是依赖 sizeof。
三、修改后的代码如下:
#include <stdio.h>
#include <string.h>
void rev(char* p, int len);
int main()
{
char str[10];
scanf("%s", str);
int len = strlen(str); // 获取字符串长度
rev(str, len);
printf("%s\n", str);
return 0;
}
void rev(char* p, int len)
{
for (int i = 0; i < len / 2; i++) {
char tmp = p[i];
p[i] = p[len - 1 - i];
p[len - 1 - i] = tmp;
}
}
四、关键点说明
-
使用 strlen 获取字符串长度
strlen(str) 返回的是字符串中有效字符的数量(不包含 \0)。
-
避免使用 sizeof 计算字符串长度
sizeof(str) 是数组的总大小,而不是字符串的有效长度。
-
循环只到 len / 2
保证每个字符都只交换一次,不会重复交换。
-
确保 str 数组足够大
str[10] 足够容纳最多 9 个字符(加上 \0)。
五、示例运行
输入:
hello
输出:
olleh
六、总结
| 问题 | 原因 | 解决方案 |
|------|------|----------|
| 无输出 | SZ 计算错误,导致函数操作越界 | 使用 strlen 获取字符串长度 |
| 逆序失败 | 循环条件或索引错误 | 使用 len / 2 控制循环次数 |
| 内存越界 | sz 不是字符串真实长度 | 避免使用 sizeof,改用 strlen |
如果你还有其他关于 C 语言的问题,欢迎继续提问!