一、逆序字符串
1、递归1
#include <stdio.h>
#include <string.h>void ReverseArray(char *str)
{char temp = *str;//1int len = (int)strlen(str);*str = *(str + len - 1);//2*(str + len - 1) = '\0';//3if(strlen(str + 1) >= 2)//只要字符串还大于2,就接着递归,接着交换{ReverseArray(str + 1);//改变字符串的长度}*(str + len - 1) = temp;//4
}int main()
{char arr[10] = "abcdef";ReverseArray(arr);printf("%s", arr);return 0;
}
递进
这时字符串长度为0,小于2。
开始回归,回归过程是之前的临时变量从前往后依次放。
最终,递归完成,字符串反转完成。
2、递归2
#include <stdio.h>
#include <string.h>void ReverseArray(char arr[], int left, int right)
{char temp = arr[left];//对称交换arr[left] = arr[right];arr[right] = temp;if (left + 1 < right - 1){ReverseArray(arr, left + 1, right - 1);}
}int main()
{char arr[10] = "abcdef";int left = 0;//数组第一个元素下标为0int right = (int)strlen(arr) - 1;//strlen求出字符串长度,减一为数组下标ReverseArray(arr,left,right);printf("%s\n", arr);return 0;
}
递进时就完成了字符串交换。
回归时函数就调用结束了,回归时没有实质的语句执行。
3、循环
#include <stdio.h>
#include <string.h>void ReverseArray(char arr[])
{int length = (int)strlen(arr);for (int i = 0; i < length / 2; i++){char temp = arr[i];arr[i] = arr[length - i - 1];arr[length - i - 1] = temp;}
}int main()
{char arr[10] = "abcdef";ReverseArray(arr);printf("%s\n", arr);return 0;
}
这个与上面的递归2相似,都是对应的位置交换。、
二、计算一个数字的每位和
#include <stdio.h>int DigitSum(int num)
{if (num > 9){return num % 10 + DigitSum(num / 10);}else{return num;}
}int main()
{int num = 0;scanf("%d",&num);int sum = DigitSum(num);printf("%d",sum);return 0;
}
三、计算n的k次方
#include <stdio.h>double Power(int num, int exp)
{if (exp > 0){return num * Power(num, exp - 1);}else if (exp == 0){return 1;}else{return (1.0 / num) * Power(num, exp + 1);}
}int main()
{int num = 0,exp = 0;scanf("%d %d",&num,&exp);double res = Power(num,exp);printf("%lf",res);return 0;
}
四、sizeof和strlen
我们平常见到的操作符是像-、=、<等等这样的,其实sizeof也是操作符,虽然它长得不像操作符。sizeof是用来计算变量(类型)所占内存空间大小,不关注内存中的存储内容,单位是字节
printf("%zu\n", sizeof(int));
printf("%zu\n", sizeof(float));
printf("%zu\n", sizeof(char));
sizeof输出的数据类型是size_t,格式字符串可用%zu或%zd。
strlen是一个库函数,定义在头文件string.h中。专门计算字符串长度不包含\0,只针对字符串,从参数给定的地址一直找,直到\0,统计\0之前的字符个数。
printf("%zu\n",strlen("abc"));
strlen输出的数据类型也是size_t,格式字符串可用%zu或%zd。
五、数组的数据类型
int num[10];
在C语言中 int num[10]; 的类型应被描述为 int [10] ,这指的是一个具有10个整数元素的整型数组类型。
数组的类型就是去掉数组名剩下的部分。
#include <stdio.h>int main()
{int num[10] = { 0 };printf("%zu\n", sizeof(num));printf("%zu\n", sizeof(int [10]));return 0;
}