嵌入式Linux工程师笔试记录 -- 2020.7.31 (二)

做题时间:2020.7.30 23:38
总结时间:2020.7.31

2015年华科精机软件工程师试题

1.按以下三种方式定义的数组有什么区别?

char p1[] = {"abcdef"};
char p2[] = "abcdef";
char p3[] = {'a','b','c','d','e','f'};

考点字符数组与字符串数组
回答
1) p1和p2位字符串数组,编译器自动为其在末尾加’\0’,作为字符串结束标志。
2) p2是p1的简写,相当于字符数组

p[] =  {‘a’,’b’,’c’,’d’,’e’,’f’,’\0};长度为7

3)而p3是字符数组,字符数组不要求最后一个字符为’\0’,初始化时系统不会自动加’\0’,长度为6.

2.程序中使用宏定义有哪些好处

参考:#define宏定义的优点和缺点
1)宏定义的优点

a.方便程序修改:使用宏代替在程序中经常使用的常量,比如某个io的寄存器地址、延时时间等。或者将较长的标识符用较短且有意义的标识符来宏定义,方便写程序。同时,将这些参数宏定义于程序头部,方便其他人阅读与修改并使用。
b. 提高程序运行效率(宏函数):宏函数相比普通函数,是直接替换到使用宏的位置,少了跳转到函数位置,并在结束的时候返回到原程序的步骤,提高程序效率。

2)宏定义的缺点

a.使用过vs编写c++应该都看到编译器推荐将#define修改为const,原因就是宏定义的一个缺点:无法对宏定义中的变量进行类型检查

3)宏定义的注意点

必须在各个分量中加括号(不能说缺点把emmm,应该指注意事项)
由于宏定义只是单纯替换,所以不加括号可能会由于运算符优先级问题导致结果不符预期。

3.结合实际简述软件工程中关于内聚和耦合的理解

参考 : 简述耦合与内聚

1.耦合是指模块之间的关联程度。如果一个模块依赖另一个模块,A依赖B,B依赖C,当C要更新版本的时候,那么B也要更新,A也要更新。所以,为了便于维护更新,需要低耦合。像计算机网络,Linux操作系统,都使用分层思想,每一层的工程师都主要专注于自己这一层的开发就行了。
2.内聚是对于块内联系,高内聚是指一个模块只左一件事。比如在类中,显示用display,赋值用set。

一个工程要便于维护,最好的方式就是低耦合,高内聚。

4.简述面向对象程序设计方法的核心特点及你的理解

参考链接:c++面向对象的三个特点

面向对象三大特征:封装、继承、多态
在这里插入图片描述
封装:把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏。
继承:扩展已存在的类。继承创建的新类称为子类,被继承的类称为父类。目的是代码可重用。
多态:目的是为了接口重用。具体实现有两种方式:覆盖和重载,覆盖是指子类重新定义弗雷的虚函数的做法。重载是指允许多个同名但参数表不同的函数,程序调用时会根据参数不同而调用不同函数。

5.用C语言些一个模块化函数,实现将一个字符串插入到另一个字符串中的指定位置

不同于之前的内存拷贝函数,
嵌入式Linux工程师笔试记录 – 2020.7.28 (一)–14.写一个函数完成内存拷贝。

此题说明了一个字符串插入到另一个字符串指定位置,表示两个字符串互相独立,假设无地址重叠,得以下解:

#include <stdio.h>
#include <assert.h>
#include <string.h>

/*
    功能:将s2插入到s1的count位置
*/
void insert ( char *s1, const char *s2 , int count ){

    assert( s1 && s2 );               /* 检查是否为空 */
    assert( strlen(s1) >= count );    /* 所给count是否合法 */
    int i = 0 ;
    int s1_cur_len = strlen(s1);

    char temp[strlen(s1)] ;
    for( i = count ; i < s1_cur_len ; i ++ ){
        /* 1.存储count之后的字符临时存储到temp中 */
        temp[i-count] = s1[i];
        s1[i] = '\0';     // 清空
    }

    for( i = 0 ; i < strlen(s2) ; i ++ )
        /* 2.将s2插入到s1的count之后 */
        s1[i+count] = s2[i];

    s1_cur_len = strlen(s1);         // 更新s1当前长度
    for( i = 0 ; i < strlen(temp) ; i ++ )
        /* 3.将temp插入到s1末尾 */
        s1[s1_cur_len+i] = temp[i];
    return;
}


int main(int argc , char **argv ){

    assert(argc>2);

    char s1[strlen(argv[1])];
    char s2[strlen(argv[2])];
    strcpy(s1 , argv[1]);
    strcpy(s2 , argv[2]);
    printf("s1 = %s\ns2 = %s\n" , s1, s2);
    insert( s1 , s2 , 2 );
    printf("s3 = %s\n" , s1);
    return 0;
}
                               

2020.8.23 , 重写一次题


#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <string.h>

char * sncat( char * s1 , int n , const char* s2){
	
	if( s1 == NULL || s2 == NULL || strlen(s1) < n )
		return NULL;
	// 假设s1的空间足够
	
	char *p = &s1[n];		// n==strlen(s1)的时候p = "\0"
	char *tmp = (char *)malloc(strlen(s1)+1);
	strcpy(tmp , s2);		// 把s2拷贝到tmp
	strcat(tmp , p);		// 把p之后的字符追加到tmp
	strcpy(p, tmp);			// 再把tmp复制到p上

	free(tmp);
	return s1;
}
  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值