输入任意十进制数,转化成十六进制数显示:
#include <stdio.h>
#include <stdlib.h>
char *int2hex(unsigned int num)
{
int temp;
unsigned int mask = 0xf;
//static char hex[11]; //0x12345678; !!!:hex的空间在栈空间:
char *hex = (char *)malloc(sizeof(char) * 11); //hex的空间在堆空间
hex[0] = '0';
hex[1] = 'X';
hex[10] = '\0';
for (int i = 0; i < 8; i++)
{
temp = num & mask;
if(temp >= 10)
{
hex[9 - i] = temp - 10 + 'A';
}
else
{
hex[9 - i] = temp + '0'; // 9 + '0' = '9'
}
num = num >> 4;
}
return hex;
}
int main(int argc, char *argv[])
{
unsigned int num;
printf("Please input num:\n");
scanf("%u", &num);
char *hex = int2hex(num);
//释放int2hex的栈空间
printf("hex = %s\n", hex);
free(hex); //内存泄露
return 0;
}
hex数组定义在栈上面(局部变量)
栈空间的特点:先进后出、系统管理、生命周期(所在函数体执行结束后释放)
堆空间:先进先出、用户管理
控制语句
if的使用注意事项:
1、条件:成立:非零
2、if后;的问题
3、判断相等时,将常量写在左边
4、规范:if必须匹配else
5、if条件中的运算符的优先级
6、判断条件的零值比较
循环语句:
死循环:while(1) for(;😉
使用注意事项:
循环条件的多分号
循环体里不要直接修改循环变量的值;
编程:通过编程实现,统计1~n有多少个9 提示:n通过参数传入
算法:
程序:
我的:错误!!!
#include <stdio.h>
int main()
{
int num;
int count=0;
int temp;
int p;
printf("please input a num:\n");
scanf("%d",&num);
printf("another num:\n");
scanf("%d",&p);
for(int i = 0;i<num;i++)
{
while(num / 10 != 0)
{
temp = num % 10;
num =num / 10;
if(temp == p)
{
count++;
}
}
}
printf("%d",count);
return 0 ;
}
正确答案:
#include <stdio.h>
int main()
{
int num;
int count = 0;
printf("please input a num:\n");
scanf("%d",&num);
for(int i = 1; i <= num;i++)
{
while(i != 0)
{
if (i % 10 == 9)
{
count++;
}
i = i / 10;
}
}
printf("count = %d\n",count);
return 0 ;
}
出现死循环:在循环体中修改了循环变量的值
i = i / 10;(i = 0;)
for循环中i++(i又等于1了)
优化:定义一个temp作为替死鬼
#include <stdio.h>
int main()
{
int num;
int count = 0;
int temp;
int p;
printf("please input a num:\n");
scanf("%d",&num);
printf("please input another num:\n");
scanf("%d",&p);
for(int i = 1; i <= num;i++)
{
temp = i;
while(temp != 0)
{
if (temp % 10 == p)
{
count++;
}
temp = temp / 10;
}
}
printf("count = %d\n",count);
return 0 ;
}
嵌套循环体的优化:长循环体在最里面;逻辑判断在循环体外;
编码规范:即使循环体只有一条语句都要加{}
do-while:
do
{
}
while()
多路分支语句:
switch(条件):条件只能是整数或者字符 表达式
不管case下语句有多少条都要加{}
一旦匹配到就会一直执行
break VS continue:
continue:结束当前这次循环,进行下一次循环判断
break:结束当前全部循环
结果会出现死循环
goto语句:
注意事项:
1、尽可能少用goto语句:goto语句会破坏代码结构;导致代码可读性差
2、标签和goto语句之间切记不要出现变量的定义
goto使用场景:异常处理