视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
华为面试题C语言软件工程师
2025-09-23 22:13:49 责编:小OO
文档
那就是变量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

    {

       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下载本文

显示全文
专题