C语言——小细节和小知识7

一、逆序字符串

1、递归1

cpp 复制代码
#include <stdio.h>
#include <string.h>

void ReverseArray(char *str)
{
	char temp = *str;//1
	int len = (int)strlen(str);
	*str = *(str + len - 1);//2
	*(str + len - 1) = '\0';//3
	if(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

cpp 复制代码
#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;//数组第一个元素下标为0
	int right = (int)strlen(arr) - 1;//strlen求出字符串长度,减一为数组下标
	ReverseArray(arr,left,right);
	printf("%s\n", arr);
	return 0;
}

递进时就完成了字符串交换。

回归时函数就调用结束了,回归时没有实质的语句执行。

3、循环

cpp 复制代码
#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相似,都是对应的位置交换。、

二、计算一个数字的每位和

cpp 复制代码
#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次方

cpp 复制代码
#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是用来计算变量(类型)所占内存空间大小,不关注内存中的存储内容,单位是字节

cpp 复制代码
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之前的字符个数。

cpp 复制代码
printf("%zu\n",strlen("abc"));

strlen输出的数据类型也是size_t,格式字符串可用%zu或%zd。

五、数组的数据类型

cpp 复制代码
int num[10];

在C语言中 int num10; 的类型应被描述为 int 10 ,这指的是一个具有10个整数元素的整型数组类型。

数组的类型就是去掉数组名剩下的部分。

cpp 复制代码
#include <stdio.h>

int main()
{
	int num[10] = { 0 };
	printf("%zu\n", sizeof(num));
	printf("%zu\n", sizeof(int [10]));
	return 0;
}
相关推荐
weixin_3077791321 小时前
C++代码实现MATLAB中的dlarray函数功能
开发语言·c++·算法·matlab
hetao17338371 天前
2026-10-03~04 hetao1733837 的刷题记录
c++·算法
Zootopia6261 天前
飞行力学知识梳理1|飞行性能与稳定性
人工智能·python·算法·机器学习·无人机·学习方法·信息与通信
longlongzihan1 天前
从LeetCode 70. 爬楼梯看动态规划:如何精准推导状态转移方程?
c++·算法·leetcode·动态规划
2601_960356381 天前
2027校招采购岗解析:数学基础如何迁移到需求预测、成本与供应商分析
人工智能·算法
h_a_o777oah1 天前
【树论】树链剖分:将树形结构转化为线性结构以处理树上路径问题(洛谷 P3384 附C++代码模板)
数据结构·算法·线段树·acm·树链剖分·树论·重链剖分
HEJOO91 天前
指针的算术运算详解
java·数据结构·算法
Coder-magician1 天前
《代码随想录》刷题打卡day47:并查集-part01
数据结构·算法·图论
垆边人似月.1 天前
VLAN 资源池(100~200 分档)
数据结构·算法
潼心1412o1 天前
C++初阶(长期更新)第6讲:类和对象(下)
开发语言·c++·算法