1 数组逆置
基本是使用第三变量帮助逆置的。
具体:
#include<stdio.h>
void my_printf(int arr[],int sz) {//对数组的输出
int i = 0;
for (i = 0;i < sz - 1;i++) {
printf(" %c ",arr[i]);
}
}
void reserver(int* arr, int sz) {//交换数组元素
int a = 0;
int* tep = &a;//创建工具指针
int *left = arr;
int* right = arr + sz-2;
while (left < right) {
*tep = *right;
*right = *left;
*left = *tep;
left++;
right--;
}
}
int main() {
int arr[10] = { 'a','b','c','d','e','f','g','h','i','\0'};
int sz = sizeof(arr) / sizeof(arr[0]);
reserver(arr,sz);
my_printf(arr,sz);
}
调试过程:
- ①对于工具指针未进行初始化,造成读取时访问空间冲突
- ②未进行循环变量的改变,死循环了
- ③int *right=arr+sz-1,会不完全输出少一个a。
- ④int* right=arr+sz,此时指针right 为野指针,超出了数组的长度
- ⑤若arr数组,内容为整型数字,则带有sz的表达式都在基础上再减去1。
变化1:
//另外的交换数组,参数为数组
void reserver(int arr[], int sz) {
int left = 0;
int right = sz - 2;
while(left<right) {
int tep = arr[right];
arr[right] = arr[left];
arr[left] = tep;
left++;
right--;
}
}
- 和具体无太多变化
变化2:
#include<stdio.h>
int my_strlen(char arr[]) { //计算长度
int count = 0;
int i = 0;
while (arr[i]!='\0') {
count++;
i++;
}
return count;
}
void reserver(char arr[]) { //逆置
char tep = arr[0];
int len = my_strlen(arr);
//printf("%d\n", len);
arr[0] = arr[len - 1];
arr[len - 1] = '\0';
if (my_strlen(arr + 1) >=2) { //递归
reserver(arr+1);
}
arr[len - 1] = tep;
}
int main() {
char arr[] = "abcdefghi";
int sz = sizeof(arr) / sizeof(arr[0]);
reserver(arr);
printf("%s", arr);
}
调试:
- ①这里使用了递归
- ②分了4步:保存第一个元素,最后元素先放到第一个位置,取出中间元素进行递归,递归结束把第一个元素放到最后位置
- ③计算长度或者大小时别忘记返回值(return)