代码说明:
- 字符串逆序:
- 使用双指针法(左右指针向中间移动交换字符),时间复杂度 O (n),空间复杂度 O (1)(原地修改)
- 包含空指针检查和输入长度限制(防止缓冲区溢出)
- 示例输入输出:输入 “hello” → 输出 “olleh”
#include <stdio.h>
#include <string.h>
// 字符串逆序函数(原地修改)
void reverse_string(char *str) {
if (str == NULL) return; // 空指针保护
int len = strlen(str);
char *left = str;
char *right = str + len - 1;
while (left < right) {
// 交换左右指针指向的字符
char temp = *left;
*left = *right;
*right = temp;
left++;
right--;
}
}
int main() {
char str[100];
printf("请输入一个字符串(不超过99字符): ");
scanf("%99s", str); // 限制输入长度防止溢出
reverse_string(str);
printf("逆序后的字符串: %s\n", str);
return 0;
}
代码说明:
- 整数逆序:
- 处理正负号,统一转换为正数计算
- 使用长整型暂存中间结果,避免计算过程中溢出
- 检查最终结果是否在 int 范围内(使用 <limits.h> 中的 INT_MAX/INT_MIN)
- 示例输入输出:输入 123 → 输出 321;输入 – 456 → 输出 – 654;输入 2147483647(INT_MAX)→ 逆序后溢出返回 0
#include <stdio.h>
#include <limits.h> // 用于INT_MAX和INT_MIN
// 整数逆序函数(返回逆序后的整数,溢出返回0)
int reverse_integer(int x) {
long reversed = 0; // 用长整型暂存防止计算过程中溢出
int sign = (x < 0) ? -1 : 1;
x = (x < 0) ? -x : x; // 统一处理正数部分
while (x > 0) {
reversed = reversed * 10 + x % 10;
x /= 10;
// 检查是否超过int范围
if (reversed > INT_MAX || reversed < INT_MIN) {
return 0;
}
}
return (int)(reversed * sign);
}
int main() {
int num;
printf("请输入一个整数: ");
scanf("%d", &num);
int reversed = reverse_integer(num);
if (reversed == 0 && num != 0) { // 排除0的情况
printf("逆序后超出int范围,无法表示\n");
} else {
printf("逆序后的整数: %d\n", reversed);
}
return 0;
}
本网站原创文章版权归何大锤的狂飙日记所有。发布者:何大锤,转转请注明出处:何大锤的博客