首页后端开发ASP.NET7个华为关于C语言的经典面试题(分享)

7个华为关于C语言的经典面试题(分享)

时间2024-02-01 01:06:02发布访客分类ASP.NET浏览128
导读:收集整理的这篇文章主要介绍了7个华为关于C语言的经典面试题(分享),觉得挺不错的,现在分享给大家,也给大家做个参考。1、找错void test1( { char string[10]; char* str1="012345678...
收集整理的这篇文章主要介绍了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;
     i10;
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;
    ImAX_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;
    I5;
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语言的经典面试题(分享)的详细内容,更多请关注其它相关文章!

声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!

上一篇: 判断char型变量ch是否为大写字母...下一篇:15道C语言开发面试题(原题分享)猜你在找的ASP.NET相关文章 C# 一些面试试题的实例教程2022-05-16.NET 6开发TodoList应用之请求日志组件HttpLogging介绍2022-04-16.NET 6中间件Http Logging使用介绍2022-04-16gojs一些实用的高级用法2022-04-16.NET6开发TodoList应用之实现查询排序2022-04-16.NET6开发TodoList应用之实现数据塑形2022-04-16.NET微服务架构CI/CD自动打包镜像2022-04-16Asp.Net Core 使用Monaco Editor 实现代码编辑器功能2022-04-16.NET微服务架构CI/CD自动构建Jenkins+Gitee2022-04-16.Net Core微服务网关Ocelot集成Consul2022-04-16 其他相关热搜词更多phpjavapython程序员loadpost-format-gallery

若转载请注明出处: 7个华为关于C语言的经典面试题(分享)
本文地址: https://pptw.com/jishu/594718.html
判断char型变量ch是否为大写字母的正确表达式是什么 Vue-router编程式导航的两种实现代码

游客 回复需填写必要信息