北京锦鸿希电笔试题

在软件生命周期中,能准确地确定软件系统必须做什么和必须具备哪些功能的阶段是:

A,概要设计 B,详细设计 C,可行性分析 D,需求分析

答案


x是整型变量,pb 是基类型为整型的指针变量,则正确的赋值表达式是:

A,pb=&x; B,pb=x; C, *pb=&x; D, *pb = *x;

答案

A


设整型数i=5,则printf(“%d”,i++);的输出为:

A,5; B,6; C,4; D,语法错误;

答案

A


#define MIN(x,y)x<y?x:y 是否正确

答案

不正确,如果x或者y代表的是一个表达式,因为运算符的优先级问题就会出现问题。

1
2
3
4
5
6
7
8
9
10
11
12
13
#include <stdio.h>

#define MIN(x, y)x<y?x:y

int main(void)
{
int ret = 5 * MIN(2, 3);
printf("%d\n", ret);

return 0;
}

输出:2

因为在预处理的过程中宏被展开为以下形式:

1
int ret = 5 * 2 > 3 ? 2 : 3;

可能会想着以下是解决上述问题的方式,但是只能解决宏替换时的问题,以下两个宏定义其中也是存在bug的

1
2
#define min(x,y)     (x) > (y)? (y): (x)
#define min(x,y) ((x) > (y)? (y): (x))

具体参考下面的文章:


书写一个对整型bit3进行置1和置0的函数

答案
1
2
3
4
5
6
7
8
9
10
#define BIT3 (0x1<<3)

void set_bit3(void) //置位
{
a |= BIT3;
}
void clear_bit3(void) //清零
{
a &= ~ BIT3;
}


解释 static的用处(至少说明两点)

答案
  1. 用于变量:static修饰的变量只在本文件中可见,外部文件不可见,只能在本文件内部使用,也就是说static申明的变量只能被本文件内的函数使用,而不能被本文件外的函数使用,在本文件内的其他函数中也不能使用static申明的变量。

  2. 用于函数:static修饰的函数可以被本文件内的函数调用,而不能被本文件外的函数调用,static申明的函数只能在本文件内使用,其他文件不能使用该函数。


char machineNum1[4] = {0x30, 0x10, 0x00, 0x11};

char machineNum2[4] = {0x30, 0x10, 0x00, 0x22};

分别用strncmpmemcmp函数对两者比较,返回值是多少

答案

strncmp:返回值是非零值

memcmp:返回值是负值

strncmp和memcmp函数的差别

  1. strncmp是比较指定长度的字符串,而memcmp是比较两个字符串的前n个字节;
  2. strncmp函数不会检查结束符(’\0’),而memcmp函数会检查结束符,如果字符串有不同的结束符,则它们被视为不同的字符串;
  3. strncmp函数是比较字符型数据,而memcmp函数是比较二进制数据。
  4. memcmp的返回值可以大于零,小于零,或者等于零,而strncmp只能返回0或者非0值,因此memcmp比strncmp更精确。


十进制的23 对应的十六进制;

十进制的23对应的BCD码(十六进制表示出来):

答案

0X17


编写函数,对连续出现两个 0x10 的进行去重处理

char cirmsg[]={0x10,0x02,0x00,0x13,0x03,0x00,0x010x00,0x01,0xE5,0x20,0x20,0x01,0x03,0x10,0x10,0x090x00,0x00,0xF5,0x00,0x1E,0x0B,0x31,0x10,0x03);

十进制的23对应的BCD码(十六进制表示出来):

答案
1
2
3
4
5
6
7
8
9
10
11
void removeDuplicates(char cirmsg[])
{
int i = 0, j = 0;
for (i = 0; i < sizeof(cirmsg) / sizeof(cirmsg[0]); i++)
{
if (cirmsg[i] != 0x10 && cirmsg[i] != 0x10)
cirmsg[j++] = cirmsg[i];
else if (cirmsg[i] == 0x10 && cirmsg[i-1] != 0x10)
cirmsg[j++] = cirmsg[i];
}
}