7个华为关于C语言的经典面试题(分享)
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循环后面应加上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); 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; }
推荐:《c语言教程》
以上是7个华为关于C语言的经典面试题(分享)的详细内容。更多信息请关注PHP中文网其他相关文章!

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

C语言数据结构:树和图的数据表示与操作树是一个层次结构的数据结构由节点组成,每个节点包含一个数据元素和指向其子节点的指针二叉树是一种特殊类型的树,其中每个节点最多有两个子节点数据表示structTreeNode{intdata;structTreeNode*left;structTreeNode*right;};操作创建树遍历树(先序、中序、后序)搜索树插入节点删除节点图是一个集合的数据结构,其中的元素是顶点,它们通过边连接在一起边可以是带权或无权的数据表示邻

文件操作难题的真相:文件打开失败:权限不足、路径错误、文件被占用。数据写入失败:缓冲区已满、文件不可写、磁盘空间不足。其他常见问题:文件遍历缓慢、文本文件编码不正确、二进制文件读取错误。

Debian系统中的readdir函数是用于读取目录内容的系统调用,常用于C语言编程。本文将介绍如何将readdir与其他工具集成,以增强其功能。方法一:C语言程序与管道结合首先,编写一个C程序调用readdir函数并输出结果:#include#include#includeintmain(intargc,char*argv[]){DIR*dir;structdirent*entry;if(argc!=2){

算法是解决问题的指令集,其执行速度和内存占用各不相同。编程中,许多算法都基于数据搜索和排序。本文将介绍几种数据检索和排序算法。线性搜索假设有一个数组[20,500,10,5,100,1,50],需要查找数字50。线性搜索算法会逐个检查数组中的每个元素,直到找到目标值或遍历完整个数组。算法流程图如下:线性搜索的伪代码如下:检查每个元素:如果找到目标值:返回true返回falseC语言实现:#include#includeintmain(void){i

如何在 C 语言中输出倒数?回答:使用循环语句。步骤:1. 定义变量 n 存储要输出的倒数数字;2. 使用 while 循环持续打印 n 直到 n 小于 1;3. 在循环体内,打印出 n 的值;4. 在循环末尾,将 n 减去 1 以输出下一个更小的倒数。

C语言多线程编程指南:创建线程:使用pthread_create()函数,指定线程ID、属性和线程函数。线程同步:通过互斥锁、信号量和条件变量防止数据竞争。实战案例:使用多线程计算斐波那契数,将任务分配给多个线程并同步结果。疑难解答:解决程序崩溃、线程停止响应和性能瓶颈等问题。

C语言函数包含定义、调用和声明。函数定义指定函数名、参数和返回类型,函数体实现功能;函数调用执行函数并提供参数;函数声明告知编译器函数类型。值传递用于参数传递,注意返回类型,保持一致的代码风格,并在函数中处理错误。掌握这些知识有助于编写优雅、健壮的C代码。

C语言函数是可重复使用的代码块,接收参数进行处理,返回结果。它类似于瑞士军刀,功能强大,需要谨慎使用。函数包括定义格式、参数、返回值、函数体等元素。高级用法包括函数指针,递归函数和回调函数。常见错误是类型不匹配、忘记声明原型。调试技巧包括打印变量、使用调试器。性能优化使用内联函数。函数设计应遵循单一职责原则。熟练掌握C语言函数可以显着提高编程效率和代码质量。
