行将工作,也温习温习相关的常识,看了看嵌入式C的笔试题,全体感觉考试标题仍是蛮有意思的,考点都比较重要,并且比较细,首要仍是规划到一些指针和数组现已函数指针等根本的概念。
比方:
怎么完成两个值中的最大值:((a+b) + abs(a-b))/2
怎么完成不依托中间量完成两个变量值的交流:
a = a + b;
b = a – b;
a = a – b;
或许
a = a^b;
b = a^b;
a = a^b;
其间后边的这种方法愈加的优胜。
sizeof与strlen的差异
其间sizeof是一个操作符,在编译进程中就能确认成果,可是strlen是一个函数,只要在运转的时分才干得到回来值。
指针、数组、函数等各种方式的指针结合起来也是命题的要点。
在编程中首要是规划到字符串、链表的处理问题,我就找几个简略的程序作为练兵吧。完成整数和字符串之间的转化问题。这个转化问题实质上是处理好ASCII码与数字之间的切换联系,即数字的ASCII码方式为‘0’= 0 + 48; ‘9’= 9 + 48;0 = 0-48。
这个联系是转化进程中最首要的问题,当然整数到字符串的转化进程中需求留意负数的影响,假如负数没有正确处理,就可能呈现一些不可思议的成果。
首要完成字符串到整数的转化进程:这个进程相对来说比较简单,由于这个进程可直接判别是正数仍是负数,直接判别下标0对应的内容即可,其他的能够经过逐渐求和累加的方式完成。根本的转化进程如下:
int myatoi(char *src)
{
char flag = 0;
int sum = 0;
int i = 0;
int len = strlen(src);
/*参数的正确性*/
if(NULL == src)
{
return 0;
}
/*是否存在符号问题*/
if(src[i] == -)
{
flag = -;
++ i ;
}
for( ; i < len ; ++ i)
{
/*判别字符是否合法*/
if(src[i] < 48 && src[i] > 57)
return 0;
/*数据求和,留意数值的转化问题src[i] – 48*/
sum = sum *10 + src[i] – 48;
}
/*依据标志位完成回来正确的正负数*/
if(flag == -)
return -sum;
else
return sum;
}
整数到字符串的转化:实践上便是将一个整数的各个位分离出来,然后完成字符串的排序问题,由于数字长度的不确认性使得不便于快速的确认字符串的长度,只能首要分化,然后排序。一起也需求留意符号的存在,根本的转化进程如下:
char* myitoa(int num, char *str)
{
char flag = 0;
int i = 0, count = 0, j = 0;
/*参数检测*/
if(NULL == str)
{
return NULL;
}
/*判别数值的正负,设置对应的符号*/
if(num < 0)
{
str[i ++] = -;
/************************
一起要对数值取绝对值
确保后边取余整除操作正常
*************************/
num = -num;
}
while(num / 10)
{
/***************************
count用来保存实践的数字个数,
便于后期的次序互换
****************************/
++ count;
/*实践保存的次序为反序列*/
str[i++] = num % 10 + 48;
num /= 10;
}
/*判别是*/
if(num %10)
{
str[i++] = num %10 + 48;
++ count;
}
/*字符串结束符*/
str[i] = 0;
/*完成数据的较好操作*/
i = 0;
if(str[0] == -)
{
i = 1;
}
/*实践交流的下标区间为i~j*/
j = count + i – 1;
for(; i < j ; ++ i, --j)
{
/*数据的较好操作*/
str[i] = str[i] + str[j];
str[j] = str[i] – str[j];
str[i] = str[i] – str[j];
}
/*回来实践的字符串*/
return str;
}
上面的代码就完成了字符串与整数的转化问题,根本上完成了各种情况的转化。