重解几道华为经典C语言面试题
- 格式:pdf
- 大小:104.91 KB
- 文档页数:6
1.第一题的题目大概是输入整型数组求数组的最小数和最大数之和,例如输入1,2,3,4则输出为5,当输入只有一个数的时候,则最小数和最大数都是该数,例如只输入1,则输出为2;另外数组的长度不超过50#include<stdio.h>main(){int num[50]={0};int i,n;printf("请输入整型数组的长度(1~50):");scanf("%d",&n);printf("请输入整型数组的元素:");for (i=0;i<n;i++){scanf("%d",&num[i]);}int min_num=num[0];int max_num=num[0];for(int j=0;j<n;j++){if(max_num<num[j])max_num=num[j];else if(min_num>num[j])min_num=num[j];}int sum=min_num+max_num;printf("数组中最大与最小值之和:%d\n",sum);return 0;}2.求两个长长整型的数据的和并输出,例如输入1233333333333333 。
3111111111111111111111111.。
,则输出。
#include<stdio.h>#include<string.h>#include<malloc.h>main(){char *num1,*num2; //两个长长整型数据char *sum;// int temp;int len_num1,len_num2; // 两个长长整型数据的长度int len_max,len_min;num1=(char*)malloc(sizeof(char));num2=(char*)malloc(sizeof(char));printf("输入两个长长整型数据:");scanf("%s",num1);printf("输入两个长长整型数据:");scanf("%s",num2);len_num1=strlen(num1);len_num2=strlen(num2);len_max=(len_num1>=len_num2)? len_num1:len_num2;len_min=(len_num1<=len_num2)? len_num1:len_num2;int len_max1=len_max;sum=(char*)malloc(sizeof(char)*len_max);memset(sum,0x00,len_max+1);//切忌初始化for(;len_num1>0&&len_num2>0;len_num1--,len_num2--){sum[len_max--]=((num1[len_num1-1]-'0')+(num2[len_num2-1]-'0'));}if(len_num1>0){sum[len_max--]=num1[len_num1 - 1 ]-'0';len_num1--;}if(len_num2>0){sum[len_max--]=num1[len_num2 - 1]-'0';len_num2--;}for(int j=len_max1;j>=0;j--) //实现进位操作{// temp=sum[j]-'0';if(sum[j]>=10){sum[j-1]+=sum[j]/10;sum[j]%=10;}}char *outsum=(char*)malloc(sizeof(char)*len_max1);j=0;while(sum[j]==0) //跳出头部0元素j++;for(int m=0;m<len_max1;j++,m++)outsum[m]=sum[j]+'0';outsum[m]='\0';printf("输出两长长整型数据之和:%s\n",outsum);return 0;}3.通过键盘输入一串小写字母(a~z)组成的字符串。
1、局部变量能否和全局变量重名?2、如何引用一个已经定义过的全局变量?3、全局变量可不可以定义在可被多个.C文件包含的头文件中?为什么?4、语句for( ;1 ;)有什么问题?它是什么意思?5、do……while和while……do有什么区别?6、请写出下列代码的输出内容#include<stdio.h>main(){int a,b,c,d;a=10;b=a++;c=++a;d=10*a++;printf("b,c,d:%d,%d,%d",b,c,d);return 0;}7、static全局变量与普通的全局变量有什么区别?static局部变量和普通局部变量有什么区别?static函数与普通函数有什么区别?8、程序的局部变量存在于________中,全局变量存在于________中,动态申请数据存在于________中。
9、设有以下说明和定义:typedef union {long i; int k[5]; char c;} DATE;struct data { int cat; DA TE cow; double dog;} too;DA TE max;则语句printf("%d",sizeof(struct date)+sizeof(max));的执行结果是:___52____10、队列和栈有什么区别?11、写出下列代码的输出内容#include<stdio.h>int inc(int a){return(++a);}int multi(int*a,int*b,int*c){return(*c=*a**b);}typedef int(FUNC1)(int in);typedef int(FUNC2) (int*,int*,int*);void show(FUNC2 fun,int arg1, int*arg2){INCp=&inc;int temp =p(arg1);fun(&temp,&arg1, arg2);printf("%d\n",*arg2);}main(){int a;show(multi,10,&a);return 0;}12、请找出下面代码中的所有错误说明:以下代码是把一个字符串倒序,如“abcd”倒序后变为“dcba”1、#include"string.h"2、main()3、{4、char*src="hello,world";5、char* dest=NULL;6、int len=strlen(src);7、dest=(char*)malloc(len);8、char* d=dest;9、char* s=src[len];10、while(len--!=0)11、d++=s--;12、printf("%s",dest);13、return 0;14、}1.-1,2,7,28,,126请问28和126中间那个数是什么?为什么?2.用两个栈实现一个队列的功能?要求给出算法和思路!3.在c语言库函数中将一个字符转换成整型的函数是atool()吗,这个函数的原型是什么?13.对于一个频繁使用的短小函数,在C语言中应用什么实现,在C++中应用什么实现?14.直接链接两个信令点的一组链路称作什么?15.接入网用的是什么接口?16.voip都用了那些协议?17.软件测试都有那些种类?18.确定模块的功能和模块的接口是在软件设计的那个队段完成的?19.enum string{x1,x2,x3=10,x4,x5,}x;问x= 0x801005,0x8010f4 ;20.unsigned char *p1;unsigned long *p2;p1=(unsigned char *)0x801000;p2=(unsigned long *)0x810000;请问p1+5= ;p2+5= ;选择题:21.Ethternet链接到Internet用到以下那个协议?A.HDLC;B.ARP;C.UDP;D.TCP;E.ID22.属于网络层协议的是:A.TCP;B.IP;C.ICMP;D.X.2523.Windows消息调度机制是:A.指令队列;B.指令堆栈;C.消息队列;D.消息堆栈;24.unsigned short hash(unsigned short key){return (key>>)%256}请问hash(16),hash(256)的值分别是:A.1.16;B.8.32;C.4.16;D.1.32找错题:25.请问下面程序有什么错误?int a[60][250][1000],i,j,k;for(k=0;k<=1000;k++)for(j=0;j<250;j++)for(i=0;i<60;i++)a[i][j][k]=0;26. 下面程序会出现什么问题?#define Max_CB 500void LmiQueryCSmd(Struct MSgCB * pmsg){unsigned char ucCmdNum;......for(ucCmdNum=0;ucCmdNum<Max_CB;ucCmdNum++) {......;}27.以下是求一个数的平方的程序,请找出错误:#define SQUARE(a)((a)*(a))int a=5;int b;b=SQUARE(a++);28.typedef unsigned char BYTEint examply_fun(BYTE gt_len; BYTE *gt_code){BYTE *gt_buf;gt_buf=(BYTE *)MALLOC(Max_GT_Length); ......if(gt_len>Max_GT_Length){return GT_Length_ERROR;}.......}问答题:29.IP Phone的原理是什么?30.TCP/IP通信建立的过程怎样,端口有什么作用?31.1号信令和7号信令有什么区别,我国某前广泛使用的是那一种?32.列举5种以上的电话新业务?参考解答:/showthread.php/1703。
C语言面试题大汇总之华为面试题5(2009-08-28 15:40:03)转载标签:分类:ITc语言面试题华为杂谈试题3:写一个“标准”宏MIN,这个宏输入两个参数并返回较小的一个。
另外,MIN(*p++, b)会产生宏的副作用剖析:这个面试题主要考查面试者对宏定义的使用,宏定义可以实现类似于函数的功能,但是它终归不是函数,而宏定义中括弧中的“参数”也不是真的参数,在宏展开的时候对“参数”进行的是一对一的替换。
程序员对宏定义的使用要非常小心,特别要注意两个问题:(1)谨慎地将宏定义中的“参数”和整个宏用用括弧括起来。
所以,严格都应判0分;(2)防止宏的副作用。
宏定义#define MIN(A,B) ((A) <= (B) ? (A) : (B))对MIN(*p++, b)的作用结果是:((*p++) <= (b) ? (*p++) : (*p++))这个表达式会产生副作用,指针p会作三次++自增操作。
除此之外,另一个应该判0分的解答是:这个解答在宏定义的后面加“;”,显示编写者对宏的概念模糊不清,只能被无情地判0分并被面试官淘汰。
解答:的作用是防止被重复引用。
作为一种面向对象的语言,C++支持函数重载,而过程式语言C则不支持。
函数被C++编译后在symbol库中的名字与C语言的不同。
例如,假设某个函数该函数被C编译器编译后在symbol库中的名字为_foo,而C++编译器则会产生像_foo_int_int之类的名字。
_foo_int_int这样的名字包含了函数名和函数参数数量及类型信息,C++就是考这种机制来实现函数重载的。
为了实现C和C++的混合编程,C++提供了C连接交换指定符号extern "C"来解决名字匹配问题,函数声明前加上extern "C"后,则编译器就会按照C语言的方式将该函数编译为_foo,这样C语言中就可以调用C++的函数了。
C语言面试题大汇总之华为面试题 ZZ1、局部变量能否和全局变量重名?答:能,局部会屏蔽全局。
要用全局变量,需要使用"::"局部变量可以与全局变量同名,在函数内引用这个变量时,会用到同名的局部变量,而不会用到全局变量。
对于有些编译器而言,在同一个函数内可以定义多个同名的局部变量,比如在两个循环体内都定义一个同名的局部变量,而那个局部变量的作用域就在那个循环体内。
2、如何引用一个已经定义过的全局变量?答:extern可以用引用头文件的方式,也可以用extern关键字,如果用引用头文件方式来引用某个在头文件中声明的全局变理,假定你将那个变写错了,那么在编译期间会报错,如果你用extern方式引用时,假定你犯了同样的错误,那么在编译期间不会报错,而在连接期间报错。
3、全局变量可不可以定义在可被多个.C文件包含的头文件中?为什么?答:可以,在不同的C文件中以static形式来声明同名全局变量。
可以在不同的C文件中声明同名的全局变量,前提是其中只能有一个C文件中对此变量赋初值,此时连接不会出错4、语句for( ;1 ;)有什么问题?它是什么意思?答:和while(1)相同。
5、do……while和while……do有什么区别?答:前一个循环一遍再判断,后一个判断以后再循环6、请写出下列代码的输出内容#includemain(){int a,b,c,d;a=10;b=a++;c=++a;d=10*a++;printf("b,c,d:%d,%d,%d",b,c,d);return 0;}答:10,12,1207、static全局变量与普通的全局变量有什么区别?static局部变量和普通局部变量有什么区别?static函数与普通函数有什么区别?全局变量(外部变量)的说明之前再冠以static 就构成了静态的全局变量。
全局变量本身就是静态存储方式,静态全局变量当然也是静态存储方式。
重解几道华为经典C语言面试题重解几道华为经典C语言面试题2009-04-17 17:09:19 作者:来源:软件屋浏览次数:171 文字大小:【大】【中】【小】1、找错1、找错void test1(){char string[10];char* str1="0123456789";strcpy(string, str1);}这里string数组越界,因为字符串长度为1 0,还有一个结束符‘\0’。
所以总共有11个字符长度。
string数组大小为10,这里越界了。
PS:使用strcpy函数的时候一定要注意前面目的数组的大小一定要大于后面字符串的大小,否则便是访问越界。
void test2(){char string[10], str1[10];for(i=0; i<10;i++){str1[i] =’a’;}strcpy(string, str1);}这里有一个一眼就能看出的问题,那就是变量i没有定义,这在代码编译阶段编译器可以帮你发现,很容易搞定。
然而很多问题是自己造成的漏洞,编译器是帮不上什么忙的。
这里最大的问题还是str1没有结束符,因为strcpy的第二个参数应该是一个字符串常量。
该函数就是利用判断第二个参数的结束符来得到是否拷贝完毕。
所以在for循环后面应加上str1p[9] = ‘\0’;PS:字符数组和字符串的最明显的区别就是字符串会被默认的加上结束符‘\0’。
void test3(char* str1){char string[10];if(strlen(str1)<=10){strcpy(string, str1);}}这里的问题仍是越界问题。
strlen函数得到字符串除结束符外的长度。
如果这里是<=10话,就很明显越界了。
小结:上面的三个找错的函数,主要是考查对字符串和字符数组的概念的掌握以及对strcpy函数和strlen函数的理解。
2、找错DSN get_SRM_no(){static int SRM_no;int I;for(I=0;I<MAX_SRM;I++){SRM_no %= MAX_SRM;if(MY_SRM.state==IDLE){break;}}if(I>=MAX_SRM)return (NULL_SRM);elsereturn SRM_no;}这里for循环的判断语句是后来我加上的,估计在网上流传的时候被人给弄丢了,根据对程序的分析,给补上了。
1.第一题的题目大概是输入整型数组求数组的最小数和最大数之和,例如输入1,2,3,4则输出为5,当输入只有一个数的时候,则最小数和最大数都是该数,例如只输入1,则输出为2;另外数组的长度不超过50#include<stdio.h>main(){int num[50]={0};int i,n;printf("请输入整型数组的长度(1~50):");scanf("%d",&n);printf("请输入整型数组的元素:");for (i=0;i<n;i++){scanf("%d",&num[i]);}int min_num=num[0];int max_num=num[0];for(int j=0;j<n;j++){if(max_num<num[j])max_num=num[j];else if(min_num>num[j])min_num=num[j];}int sum=min_num+max_num;printf("数组中最大与最小值之和:%d\n",sum);return 0;}2.求两个长长整型的数据的和并输出,例如输入1233333333333333 。
3111111111111111111111111.。
,则输出。
#include<stdio.h>#include<string.h>#include<malloc.h>main(){char *num1,*num2; //两个长长整型数据char *sum;// int temp;int len_num1,len_num2; // 两个长长整型数据的长度int len_max,len_min;num1=(char*)malloc(sizeof(char));num2=(char*)malloc(sizeof(char));printf("输入两个长长整型数据:");scanf("%s",num1);printf("输入两个长长整型数据:");scanf("%s",num2);len_num1=strlen(num1);len_num2=strlen(num2);len_max=(len_num1>=len_num2)? len_num1:len_num2;len_min=(len_num1<=len_num2)? len_num1:len_num2;int len_max1=len_max;sum=(char*)malloc(sizeof(char)*len_max);memset(sum,0x00,len_max+1);//切忌初始化for(;len_num1>0&&len_num2>0;len_num1--,len_num2--){sum[len_max--]=((num1[len_num1-1]-'0')+(num2[len_num2-1]-'0'));}if(len_num1>0){sum[len_max--]=num1[len_num1 - 1 ]-'0';len_num1--;}if(len_num2>0){sum[len_max--]=num1[len_num2 - 1]-'0';len_num2--;}for(int j=len_max1;j>=0;j--) //实现进位操作{// temp=sum[j]-'0';if(sum[j]>=10){sum[j-1]+=sum[j]/10;sum[j]%=10;}}char *outsum=(char*)malloc(sizeof(char)*len_max1);j=0;while(sum[j]==0) //跳出头部0元素j++;for(int m=0;m<len_max1;j++,m++)outsum[m]=sum[j]+'0';outsum[m]='\0';printf("输出两长长整型数据之和:%s\n",outsum);return 0;}3.通过键盘输入一串小写字母(a~z)组成的字符串。
C语言面试题大汇总——华为面试题1、局部变量能否和全局变量重名?答:能,局部会屏蔽全局。
要用全局变量,需要使用"::" ;局部变量可以与全局变量同名,在函数内引用这个变量时,会用到同名的局部变量,而不会用到全局变量。
对于有些编译器而言,在同一个函数内可以定义多个同名的局部变量,比如在两个循环体内都定义一个同名的局部变量,而那个局部变量的作用域就在那个循环体内。
2、如何引用一个已经定义过的全局变量?答:extern 可以用引用头文件的方式,也可以用extern关键字,如果用引用头文件方式来引用某个在头文件中声明的全局变理,假定你将那个编写错了,那么在编译期间会报错,如果你用extern方式引用时,假定你犯了同样的错误,那么在编译期间不会报错,而在连接期间报错。
3、全局变量可不可以定义在可被多个.C文件包含的头文件中?为什么?答:可以,在不同的C文件中以static形式来声明同名全局变量。
可以在不同的C文件中声明同名的全局变量,前提是其中只能有一个C文件中对此变量赋初值,此时连接不会出错.4、请写出下列代码的输出内容#include <stdio.h>int main(void){int a,b,c,d;a=10;b=a++;c=++a;d=10*a++;printf("b,c,d:%d,%d,%d",b,c,d);return 0;}答:10,12,1205、static全局变量与普通的全局变量有什么区别?static局部变量和普通局部变量有什么区别?static函数与普通函数有什么区别?答: 1) 全局变量(外部变量)的说明之前再冠以static 就构成了静态的全局变量。
全局变量本身就是静态存储方式,静态全局变量当然也是静态存储方式。
这两者在存储方式上并无不同。
这两者的区别在于非静态全局变量的作用域是整个源程序,当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的。
华为C语言面试题集C语言面试题-华为C语言面试题深圳华为面试C语言面试题1、部分变量能否和全局变量重名?答:能,部分会屏蔽全局。
要用全局变量,需要使用"::"部分变量可以与全局变量同名,在函数内引用这个变量时,会用到同名的部分变量,而不会用到全局变量。
对于有些编译器而言,在同一个函数内可以定义多个同名的部分变量,比方在两个循环体内都定义一个同名的部分变量,而那个部分变量的作用域就在那个循环体内。
2、如何引用一个已经定义过的全局变量?答:extern可以用引用头文件的方式,也可以用extern关键字,假如用引用头文件方式来引用某个在头文件中声明的全局变理,假定你将那个变写错了,那么在编译期间会报错,假如你用extern方式引用时,假定你犯了同样的错误,那么在编译期间不会报错,而在连接期间报错。
3、全局变量可不可以定义在可被多个.C文件包含的头文件中?为什么?答:可以,在不同的C文件中以static形式来声明同名全局变量。
可以在不同的C文件中声明同名的全局变量,前提是其中只能有一个C文件中对此变量赋初值,此时连接不会出错7、static全局变量与普通的全局变量有什么区别?static部分变量和普通部分变量有什么区别?static函数与普通函数有什么区别?全局变量(外部变量)的说明之前再冠以static 就构成了静态的全局变量。
全局变量本身就是静态存储方式,静态全局变量当然也是静态存储方式。
这两者在存储方式上并无不同。
这两者的区别虽在于非静态全局变量的作用域是整个源程序,当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的。
而静态全局变量那么限制了其作用域,即只在定义该变量的源文件内有效,在同一源程序的其它源文件中不能使用它。
由于静态全局变量的作用域局限于一个源文件内,只能为该源文件内的函数公用,因此可以防止在其它源文件中引起错误。
从以上分析可以看出,把部分变量改变为静态变量后是改变了它的存储方式即改变了它的生存期。
华为c语言面试题C语言作为一门广泛应用于嵌入式系统和高性能计算领域的编程语言,成为了许多IT从业者必备的技能之一。
在华为的面试中,C语言题目也常常出现,对应聘者的编程基础和逻辑思维能力有所考察。
在本文中,我们将介绍一些常见的华为C语言面试题,供大家参考。
一、变量与数据类型1. 如何声明一个整型变量并初始化为10?int x = 10;2. 如何声明一个字符型变量并初始化为字母'A'?char ch = 'A';3. 如何声明一个常量,并将其值设定为3.14?const float pi = 3.14;4. 如何交换两个变量的值,例如将变量a的值与变量b的值交换?int temp;temp = a;a = b;b = temp;二、控制结构1. 请写出一个实现求1到100之间所有奇数和的C语言程序。
```c#include <stdio.h>int main() {int sum = 0;int i;for (i = 1; i <= 100; i += 2) {sum += i;}printf("奇数和为:%d\n", sum);return 0;}```2. 请写出一个实现判断一个数是否为素数的C语言程序。
```c#include <stdio.h>int isPrime(int num) {int i;for (i = 2; i <= num / 2; i++) {if (num % i == 0) {return 0;}}return 1;}int main() {int num;printf("请输入一个整数:");scanf("%d", &num);if (isPrime(num)) {printf("%d是素数。
\n", num); } else {printf("%d不是素数。
C语言面试题大汇总之华为面试题 ZZ1、局部变量能否和全局变量重名?答:能,局部会屏蔽全局。
要用全局变量,需要使用"::"局部变量可以与全局变量同名,在函数内引用这个变量时,会用到同名的局部变量,而不会用到全局变量。
对于有些编译器而言,在同一个函数内可以定义多个同名的局部变量,比如在两个循环体内都定义一个同名的局部变量,而那个局部变量的作用域就在那个循环体内。
2、如何引用一个已经定义过的全局变量?答:extern可以用引用头文件的方式,也可以用extern关键字,如果用引用头文件方式来引用某个在头文件中声明的全局变理,假定你将那个变写错了,那么在编译期间会报错,如果你用extern方式引用时,假定你犯了同样的错误,那么在编译期间不会报错,而在连接期间报错。
3、全局变量可不可以定义在可被多个.C文件包含的头文件中?为什么?答:可以,在不同的C文件中以static形式来声明同名全局变量。
可以在不同的C文件中声明同名的全局变量,前提是其中只能有一个C文件中对此变量赋初值,此时连接不会出错4、语句for( ;1 ;)有什么问题?它是什么意思?答:和while(1)相同。
5、do……while和while……do有什么区别?答:前一个循环一遍再判断,后一个判断以后再循环6、请写出下列代码的输出内容#includemain(){int a,b,c,d;a=10;b=a++;c=++a;d=10*a++;printf("b,c,d:%d,%d,%d",b,c,d);return 0;}答:10,12,1207、static全局变量与普通的全局变量有什么区别?static局部变量和普通局部变量有什么区别?static函数与普通函数有什么区别?全局变量(外部变量)的说明之前再冠以static 就构成了静态的全局变量。
全局变量本身就是静态存储方式,静态全局变量当然也是静态存储方式。
(一) 初级题1. 什么是预编译,何时需要预编译:答:(1) 总是使用不经常改动的大型代码体(2) 程序由多个模块组成,所有模块都使用一组标准的包含文件和相同的编译选项。
在这种情况下,可以将所有包含文件预编译为一个预编译头<<预编译又称为预处理,是做些代码文本的替换工作处理#开头的指令,比如拷贝#include包含的文件代码,#define宏定义的替换,条件编译等就是为编译做的预备工作的阶段主要处理#开始的预编译指令预编译指令指示了在程序正式编译前就由编译器进行的操作,可以放在程序中的任何位置。
常见的预编译指令有:>>2. char * const pchar const * pconst char *p上述三个有什么区别?答:char * const p; //常量指针,p的值不可以修改char const * p;//指向常量的指针,指向的常量值不可以改const char *p;//和char const *p3.char str1[] = "abc";char str2[] = "abc";const char str3[] = "abc";const char str4[] = "abc";const char *str5 = "abc";const char *str6 = "abc";char *str7 = "abc";char *str8 = "abc";cout << ( str1 == str2 ) << endl;cout << ( str3 == str4 ) << endl;cout << ( str5 == str6 ) << endl;cout << ( str7 == str8 ) << endl;结果是:0 0 1 1str1,str2,str3,str4是数组变量,它们有各自的内存空间;而str5,str6,str7,str8是指针,它们指向相同的常量区域。
16.谈谈Windows DNA结构的特点和优点。
答:Windows Distributed interNet Application Architecture(Windows分布式应用结构,简称Windows DNA)是微软创建新一代高适应性商业解决方案的框架,它使公司能够充分地挖掘数字神经系统的优点。
Windows DNA是第一个将Internet、客户/服务器、和用于计算的PC模型结合并集成在一起的为新一类分布式计算方案而设计的应用软件体系结构17.网络编程中设计并发服务器,使用多进程与多线程,请问有什么区别?答:1)进程:子进程是父进程的复制品。
子进程获得父进程数据空间、堆和栈的复制品。
2)线程:相对与进程而言,线程是一个更加接近与执行体的概念,它可以与同进程的其他线程共享数据,但拥有自己的栈空间,拥有独立的执行序列。
两者都可以提高程序的并发度,提高程序运行效率和响应时间。
线程和进程在使用上各有优缺点:线程执行开销小,但不利于资源管理和保护;而进程正相反。
同时,线程适合于在SMP机器上运行,而进程则可以跨机器迁移。
思科1. 用宏定义写出swap(x,y)答#define swap(x, y)x = x + y;y = x - y;x = x - y;2.数组a[N],存放了1至N-1个数,其中某个数重复一次。
写一个函数,找出被重复的数字.时间复杂度必须为o(N)函数原型:int do_dup(int a[],int N)答:int do_dup(int a[],int N) //未经调试{int sun = 0;int sum2;for(int i=0;i<N;++i){Sum+=a[i];}Sum2 = (1+N-1)*N/2;Return (sum-sum2);}3 一语句实现x是否为2的若干次幂的判断答:方法1)int i = 512;cout << boolalpha << ((i & (i - 1)) ? false : true) << endl; //位与为0,则表示是2的若干次幂2)return (x>>N==1);4.unsigned int intvert(unsigned int x,int p,int n)实现对x的进行转换,p 为起始转化位,n为需要转换的长度,假设起始点在右边.如x=0b00010001,p=4,n=3转换后x=0b0110 0001答:unsigned int intvert(unsigned int x,int p,int n) //假定p=4,n=3 {unsigned int _t = 0;unsigned int _a = 1;for(int i = 0; i < n; ++i)//循环的目的主要是-t{_t |= _a; //位或_a = _a << 1;}_t = _t << p; //转换后_t变为1110000x ^= _t; /异或,将原来的位取反return x;}慧通:1. 什么是预编译,何时需要预编译:答: 就是指程序执行前的一些预处理工作,主要指#表示的.何时需要预编译?1)、总是使用不经常改动的大型代码体。
C语言面试题大汇总之华为面试题6试题5:编写一个函数,作用是把一个char组成的字符串循环右移n个。
比如原来是“abcdefghi”如果n=2,移位后应该是“hiabcdefgh”函数头是这样的://pStr是指向以''结尾的字符串的指针//steps是要求移动的nvoid LoopMove ( char * pStr, int steps ){//请填充...}解答:正确解答1:void LoopMove ( char *pStr, int steps ){int n = strlen( pStr ) - steps;char tmp[MAX_LEN];strcpy ( tmp, pStr + n );strcpy ( tmp + steps, pStr);*( tmp + strlen ( pStr ) ) = '';strcpy( pStr, tmp );}正确解答2:void LoopMove ( char *pStr, int steps ){int n = strlen( pStr ) - steps;char tmp[MAX_LEN];memcpy( tmp, pStr + n, steps );memcpy(pStr + steps, pStr, n );memcpy(pStr, tmp, steps );}剖析:这个试题主要考查面试者对标准库函数的熟练程度,在需要的时候引用库函数能够很大程度上简化程序编写的工作量。
最频繁被使用的库函数包括:(1) strcpy(2) memcpy(3) memset试题6:已知WAV文件格式如下表,打开一个WAV文件,以适当的数据结构组织WAV文件头并解析WAV格式的各项信息。
WAVE文件格式说明表偏移地址字节数数据类型内容文件头00H 4 Char "RIFF"标志04H 4 int32 文件长度08H 4 Char "WAVE"标志0CH 4 Char "fmt"标志10H 4 过渡字节(不定)14H 2 int16 格式类别16H 2 int16 通道数18H 2 int16采样率(每秒样本数),表示每个通道的播放速度1CH 4 int32 波形音频数据传送速率20H 2 int16 数据块的调整数(按字节算的)22H 2 每样本的数据位数24H 4 Char 数据标记符”data”28H 4 int32 语音数据的长度解答:将WAV文件格式定义为结构体WAVEFORMAT:typedef struct tagWaveFormat{char cRiffFlag[4];UIN32 nFileLen;char cWaveFlag[4];char cFmtFlag[4];char cTransition[4];UIN16 nFormatTag ;UIN16 nChannels;UIN16 nSamplesPerSec;UIN32 nAvgBytesperSec;UIN16 nBlockAlign;UIN16 nBitNumPerSample;char cDataFlag[4];UIN16 nAudioLength;} WAVEFORMAT;假设WAV文件内容读出后存放在指针buffer开始的内存单元内,则分析文件格式的代码很简单,为:WAVEFORMAT waveFormat;memcpy( &waveFormat, buffer,sizeof( WAVEFORMAT ) );直接经过访问waveFormat的成员,就能够获得特定WAV文件的各项格式信息。
华为面试题 c语言华为面试题 c语言华为面试题 c语言(一)题目:输入一个正整数 X,在下面的等式左边的数字之间添加+号或者-号,使得等式成立。
1 2 3 4 5 6 7 8 9 = X比如:12-34+5-67+89 = 51+23+4-5+6-7-8-9 = 5请编写程序,统计满足输入整数的所有整数个数。
输入:正整数,等式右边的数字输出:使该等式成立的个数样例输入: 5样例输出: 21【下面的代码只输出了所有的等式,没有输出个数】代码如下:#includevoid dfs(int layer, int currentResult, int lastOp, int lastSum);const char sym[3] = {'+' , '-' , ' '};int ops[21] = {0};int result , num;void main(){while (1){printf("请输入等式右边的值\n");scanf("%c",&result);printf("\n以下是使等式成立的公式:\n");dfs(1,0,0,0);}return ;}void dfs(int layer, int currentResult, int lastOp, int lastSum) {int i;lastSum *= (layer > 9) ? 100 : 10;lastSum += layer;if(layer == 9){currentResult += (lastOp) ? (-1 * lastSum) : lastSum;if(currentResult == result){++num;printf("1");for(i = 2 ; i <= 9 ; ++i){if(sym[ops[i-1]] != ' ')printf(" %c ", sym[ops[i-1]]);printf("%d", i);}printf(" = %d\n" , result);}return;}ops[layer] = 2;dfs(layer + 1 , currentResult , lastOp , lastSum);currentResult += (lastOp)? (-1 * lastSum) : lastSum;ops[layer] = 0;dfs(layer + 1 , currentResult , 0 , 0);ops[layer] = 1;dfs(layer + 1 , currentResult , 1 , 0);}华为面试题 c语言(二)一面:介绍我的项目,针对我的项目中的点询问是如何实现的Activity生命周期?为什么Activity要这么设计?这样设计有什么好处?Android与iOS运行机制上有哪些不同?为什么Android用起来没有iOS流畅?为了让Android系统更流畅,应该从哪些方面做好?如何让Service不被杀死?Android系统分层?Library层起什么作用?如果一个应用要升级需要注意哪些方面?(我回答服务端api要兼容,如果只是小bug就通过补丁方式,但是貌似面试官不满意,就引导我说数据方面的,我才知道原来是想要我说本地数据的兼容)问我有什么要问他的?还有其他的一些问题,记不太清了….二面:二面是一个中年男人,一开始很严肃,聊了几句后它就笑嘻嘻了。
C语言面试题大汇总之华为面试题女性时尚购物网编辑:8、程序的局部变量存在于(堆栈)中,全局变量存在于(静态区 )中,动态申请数据存在于( 堆)中。
9、设有以下说明和定义:typedef union {long i; int k; char c;} DATE; struct data { int cat; DATE cow; double dog;} too; DATE max; 则语句 printf( "%d ",sizeof(struct date)+sizeof(max));的执行结果是:___52____ 答:DATE是一个union, 变量公用空间. 里面最大的变量类型是int, 占用20个字节. 所以它的大小是20 data是一个struct, 每个变量分开占用空间. 依次为int4 + DATE20 + double8 = 32. 所以结果是20 + 32 = 52. 当然...在某些16位编辑器下, int可能是2字节,那么结果是 int2 + DATE10 + double8 = 20 10、队列和栈有什么区别? 队列先进先出,栈后进先出11、写出下列代码的输出内容#include int inc(int a) { return(++a); } int multi(int*a,int*b,int*c) { return(*c=*a**b); } typedef int(FUNC1)(int in); typedef int(FUNC2) (int*,int*,int*); void show(FUNC2 fun,int arg1, int*arg2) { INCp=&inc; int temp =p(arg1); fun(&temp,&arg1, arg2);printf( "%d\n ",*arg2); } main() { int a; show(multi,10,&a); return 0; } 答:110 12、请找出下面代码中的所以错误说明:以下代码是把一个字符串倒序,如“abcd”倒序后变为“dcba”1、#include " " 2、main() 3、{ 4、 char*src= "hello,world "; 5、 char* dest=NULL; 6、int len=strlen(src); 7、dest=(char*)malloc(len); 8、 char* d=dest; 9、char* s=src; 10、 while(len--!=0) 11、 d++=s--;12、 printf( "%s ",dest); 13、 return 0; 14、} 答:方法1:int main() { char* src = "hello,world "; int len = strlen(src); char* dest = (char*)malloc(len+1);//要为\0分配一个空间char* d = dest; char* s = &src;//指向最后一个字符while( len-- != 0 ) *d++=*s--; *d = 0;//尾部要加\0 printf( "%s\n ",dest); free(dest);// 使用完,应当释放空间,以免造成内存汇泄露return 0; } 方法2:#include#include main() { char str= "hello,world "; int len=strlen(str); char t; for(int i=0; i> )%256 } 请问hash(16),hash(256)的值分别是: ;;; 找错题: 25.请问下面程序有什么错误? int a,i,j,k; for(k=0;k。
C语言面试题大汇总——华为面试题1、局部变量能否和全局变量重名?答:能,局部会屏蔽全局。
要用全局变量,需要使用"::" ;局部变量可以与全局变量同名,在函数内引用这个变量时,会用到同名的局部变量,而不会用到全局变量。
对于有些编译器而言,在同一个函数内可以定义多个同名的局部变量,比如在两个循环体内都定义一个同名的局部变量,而那个局部变量的作用域就在那个循环体内。
2、如何引用一个已经定义过的全局变量?答:extern 可以用引用头文件的方式,也可以用extern关键字,如果用引用头文件方式来引用某个在头文件中声明的全局变理,假定你将那个编写错了,那么在编译期间会报错,如果你用extern方式引用时,假定你犯了同样的错误,那么在编译期间不会报错,而在连接期间报错。
3、全局变量可不可以定义在可被多个.C文件包含的头文件中?为什么?答:可以,在不同的C文件中以static形式来声明同名全局变量。
可以在不同的C文件中声明同名的全局变量,前提是其中只能有一个C文件中对此变量赋初值,此时连接不会出错.4、请写出下列代码的输出内容#include <stdio.h>int main(void){int a,b,c,d;a=10;b=a++;c=++a;d=10*a++;printf("b,c,d:%d,%d,%d",b,c,d);return 0;}答:b,c,d:10,12,1205、static全局变量与普通的全局变量有什么区别?static局部变量和普通局部变量有什么区别?static函数与普通函数有什么区别?答: 1) 全局变量(外部变量)的说明之前再冠以static 就构成了静态的全局变量。
全局变量本身就是静态存储方式,静态全局变量当然也是静态存储方式。
这两者在存储方式上并无不同。
这两者的区别在于非静态全局变量的作用域是整个源程序,当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的。
重解几道华为经典C语言面试题2009-04-17 17:09:19 作者:来源:软件屋浏览次数:171 文字大小:【大】【中】【小】
1、找错
1、找错
void test1()
{
char string[10];
char* str1="0123456789";
strcpy(string, str1);
}
这里string数组越界,因为字符串长度为10,还有一个结束符‘\0’。
所以总共有11个字符长度。
string数组大小为10,这里越界了。
PS:使用strcpy函数的时候一定要注意前面目的数组的大小一定要大于后面字符串的大小,否则便是访问越界。
void test2()
{
char string[10], str1[10];
for(i=0; i<10;i++)
{
str1[i] =’a’;
}
strcpy(string, str1);
}
这里有一个一眼就能看出的问题,那就是变量i没有定义,这在代码编译阶段编译器可以帮你发现,很容易搞定。
然而很多问题是自己造成的漏洞,编译器是帮不上什么忙的。
这里最大的问题还是str1没有结束符,因为strcpy的第二个参数应该是一个字符串常量。
该函数就是利用判断第二个参数的结束符来得到是否拷贝完毕。
所以在for循环后面应加上s tr1p[9] = ‘\0’;
PS:字符数组和字符串的最明显的区别就是字符串会被默认的加上结束符‘\0’。
void test3(char* str1)
{
char string[10];
if(strlen(str1)<=10)
{
strcpy(string, str1);
}
}
这里的问题仍是越界问题。
strlen函数得到字符串除结束符外的长度。
如果这里是<=1 0话,就很明显越界了。
小结:上面的三个找错的函数,主要是考查对字符串和字符数组的概念的掌握以及对strcpy函数和strlen函数的理解。
2、找错
DSN get_SRM_no()
{
static int SRM_no;
int I;
for(I=0;I<MAX_SRM;I++)
{
SRM_no %= MAX_SRM;
if(MY_SRM.state==IDLE)
{
break;
}
}
if(I>=MAX_SRM)
return (NULL_SRM);
else
return SRM_no;
}
这里for循环的判断语句是后来我加上的,估计在网上流传的时候被人给弄丢了,根据对程序的分析,给补上了。
估计错误应该不是这儿。
简单的阅读一下这个函数,可以大概的可以猜测出这个函数的功能是分配一个空闲的SRAM块。
方法:从上次分配的RAM块后的RAM块开始检测SRAM每个RAM块,看是否是IDLE
状态,如果是IDLE则返回当前的RAM块的号SRM_no.如果所有的RAM块都不是IDLE状态,则意味着无法分配一个RAM给函数调用者,返回一个表示没有RAM可分配的标志(NULL_SRM)。
经过上面的分析,则这里可以知道,这个函数的错误是for循环里面没有给SRM_no这个变量累加1.
3、写出程序运行结果
int sum(int a)
{
auto int c=0;
static int b=3;
c+=1;
b+=2;
return(a+b+c);
}
void main()
{
int I;
int a=2;
for(I=0;I<5;I++)
{
printf("%d,", sum(a));
}
}
运行结果是:8,10,12,14,16,
在求和函数sum里面c是auto变量,根据auto变量特性知每次调用sum函数时变量c 都会自动赋值为0.b是static变量,根据static变量特性知每次调用sum函数时变量b都会使用上次调用sum函数时b保存的值。
简单的分析一下函数,可以知道,若传入的参数不变,则每次调用sum函数返回的结果,都比上次多2.所以答案是:8,10,12,14,16,
4、func(1) =?
int func(int a)
{
int b;
switch(a)
{
case 1: 30;
case 2: 20;
case 3: 16;
default: 0;
}
return b;
}
在 case 语句中可能忘记了对变量b赋值。
如果改为下面的代码:
int func(int a)
{
int b;
switch(a)
{
case 1: b = 30;
case 2: b = 20;
case 3: b = 16;
default: b = 0;
}
return b;
}
因为case语句中漏掉了break语句,所以无论传给函数的参数是多少,运行结果均为0.
5、a[q - p] =?
int a[3];
a[0]=0; a[1]=1; a[2]=2;
int *p, *q;
p=a;
q=&a[2];
很明显:a[q - p] = a[2] = 2;
6、内存空间占用问题
定义 int **a[3][4],则变量占有的内存空间为:16位系统24,32位编译系统中是48. PS:公式:3 * 4 * sizeof(int **) .
7、程序编写
编写一个函数,要求输入年月日时分秒,输出该年月日时分秒的下一秒。
如输入2004年12月31日23时59分59秒,则输出2005年1月1日0时0分0秒。
void ResetTheTime(int *year,int *month,int *date,int *hour,int *minute,int*second) {
int dayOfMonth[12]={31,28,31,30,31,30,31,31,30,31,30,31};
if( *year < 0 || *month < 1 || *month > 12 ||
*date < 1 || *date > 31 || *hour < 0 || *hour > 23 ||
*minute < 0 ||*minute > 59|| *second <0 || *second >60 )
return;
if( *year%400 == 0 || *year%100 != 0 && *year%4 == 0 )
dayOfMonth[1] = 29;
if(*second >= 60)
{
*second = 0;
*minute += 1;
if(*minute >= 60)
{
*minute = 0;
*hour += 1;
if(*hour >= 24)
{
*hour = 0;
*date += 1;
if(*date > dayOfMonth[*month-1])
{
*date = 1;
*month += 1;
if(*month > 12)
{
*month=1;
*year += 1;
}
}
}
}
}
return;
}。