1、1、将一个字符串逆序 2、将一个链表逆序 3、计算一个字节里(byte)里面有多少 bit 被置 1 4、搜索给定的字节(byte) 5、在一个字符串中找到可能的最长的子字符串 6、字符串转换为整数 7、整数转换为字符串/* 题目:将一个字符串逆序* 完成时间:2006.9.30 深圳极讯网吧* 版权归刘志强所有* 描述:写本程序的目的是希望练一下手,希望下午去面试能成功,不希望国庆节之后再去找工作拉!#include using namespace std;/#define NULL (void *)0)char * mystrrev(char * const dest,const char
2、 * const src)if (dest=NULL char *addr = dest;int val_len = strlen(src);destval_len = 0;int i;for (i=0; inext; while(q!=NULL) temp=q-next; q-next=p; p=q; q=temp; 这样增加个辅助的指针就行乐。ok 通过编译的代码: #include #include #include typedef struct List int data; struct List *next; List; List *list_create(void) struct
3、List *head,*tail,*p; int e; head=(List *)malloc(sizeof(List); tail=head; printf(“nList Create,input numbers(end of 0):“); scanf(“%d“, while(e) p=(List *)malloc(sizeof(List); p-data=e; tail-next=p; tail=p; scanf(“%d“, tail-next=NULL; return head; List *list_reverse(List *head) List *p,*q,*r; p=head;
4、q=p-next; while(q!=NULL) r=q-next; q-next=p; p=q; q=r; head-next=NULL; head=p; return head; void main(void) struct List *head,*p; int d; head=list_create(); printf(“n“); for(p=head-next;p;p=p-next) printf(“-%d-“,p-data); head=list_reverse(head); printf(“n“); for(p=head;p-next;p=p-next) printf(“-%d-“
5、,p-data); 编写函数数 N 个 BYTE 的数据中有多少位是 1。解:此题按步骤解:先定位到某一个 BYTE 数据;再计算其中有多少个 1。叠加得解。#incluede#define N 10/定义 BYTE 类型别名#ifndef BYTEtypedef unsigned char BYTE;#endifint comb(BYTE b,int n)int count=0;int bi,bj;BYTE cc=1,tt;/历遍到第 bi 个 BYTE 数据for(bi=0;bi1;tt=tt/2;return count;/测试int main()BYTE b10=3,3,3,11,1,
6、1,1,1,1,1;cout iCount) iCount = iTemp, cpDest = cpTemp;if(!*cpSource) break;+cpSource;return cpDest;#include #include / 自定义函数 MyAtoI/ 实现整数字符串转换为证书输出/ 程序不检查字符串的正确性,请用户在调用前检查int MyAtoI(char str)int i;int weight = 1; / 权重int rtn = 0; / 用作返回for(i = strlen(str) - 1; i = 0; i-)rtn += (stri - 0)* weight; /
7、 weight *= 10; / 增重return rtn;void main()char str32;printf(“Input a string :“);gets(str);printf(“%dn“, MyAtoI(str);#include#includevoid reverse(char s) /字符串反转 int c, i=0, j; for(j=strlen(s)-1;i0); /如果是负数,补上负号 if(sign 6) ? puts(“ 6“) : puts(“6“。原因是当表达式中存在有符号类型和无符号类型时所有的操作数都自动转换为无符号类型。因此-20 变成了一个非常大的正
8、整数,所以该表达式计算出的结果大于6。这一点对于应当频繁用到无符号数据类型的嵌入式系统来说是丰常重要的。如果你答错了这个问题,你也就到了得不到这份工作的边缘。 13. 评价下面的代码片断: unsigned int zero = 0; unsigned int compzero = 0xFFFF; /*1s complement of zero */ 对于一个 int 型不是 16 位的处理器为说,上面的代码是不正确的。应编写如下: unsigned int compzero = 0; 这一问题真正能揭露出应试者是否懂得处理器字长的重要性。在我的经验里,好的嵌入式程序员非常准确地明白硬件的细节
9、和它的局限,然而 PC 机程序往往把硬件作为一个无法避免的烦恼。 到了这个阶段,应试者或者完全垂头丧气了或者信心满满志在必得。如果显然应试者不是很好,那么这个测试就在这里结束了。但如果显然应试者做得不错,那么我就扔出下面的追加问题,这些问题是比较难的,我想仅仅非常优秀的应试者能做得不错。提出这些问题,我希望更多看到应试者应付问题的方法,而不是答案。不管如何,你就当是这个娱乐吧. 动态内存分配(Dynamic memory allocation) 14. 尽管不像非嵌入式计算机那么常见,嵌入式系统还是有从堆(heap )中动态分配内存的过程的。那么嵌入式系统中,动态分配内存可能发生的问题是什么?
10、 这里,我期望应试者能提到内存碎片,碎片收集的问题,变量的持行时间等等。这个主题已经在 ESP 杂志中被广泛地讨论过了(主要是 P.J. Plauger, 他的解释远远超过我这里能提到的任何解释) ,所有回过头看一下这些杂志吧!让应试者进入一种虚假的安全感觉后,我拿出这么一个小节目: 下面的代码片段的输出是什么,为什么? char *ptr; if (ptr = (char *)malloc(0) = NULL) puts(“Got a null pointer“); else puts(“Got a valid pointer“); 这是一个有趣的问题。最近在我的一个同事不经意把 0 值传给
11、了函数 malloc,得到了一个合法的指针之后,我才想到这个问题。这就是上面的代码,该代码的输出是“Got a valid pointer“。我用这个来开始讨论这样的一问题,看看被面试者是否想到库例程这样做是正确。得到正确的答案固然重要,但解决问题的方法和你做决定的基本原理更重要些。 Typedef 15 Typedef 在 C 语言中频繁用以声明一个已经存在的数据类型的同义字。也可以用预处理器做类似的事。例如,思考一下下面的例子: #define dPS struct s * typedef struct s * tPS; 以上两种情况的意图都是要定义 dPS 和 tPS 作为一个指向结构
12、s 指针。哪种方法更好呢?(如果有的话)为什么? 这是一个非常微妙的问题,任何人答对这个问题(正当的原因)是应当被恭喜的。答案是:typedef 更好。思考下面的例子: dPS p1,p2; tPS p3,p4; 第一个扩展为 struct s * p1, p2; . 上面的代码定义 p1 为一个指向结构的指,p2 为一个实际的结构,这也许不是你想要的。第二个例子正确地定义了 p3 和 p4 两个指针。 晦涩的语法 16 . C 语言同意一些令人震惊的结构,下面的结构是合法的吗,如果是它做些什么? int a = 5, b = 7, c; c = a+b; 这个问题将做为这个测验的一个愉快的结
13、尾。不管你相不相信,上面的例子是完全合乎语法的。问题是编译器如何处理它?水平不高的编译作者实际上会争论这个问题,根据最处理原则,编译器应当能处理尽可能所有合法的用法。因此,上面的代码被处理成: c = a+ + b; 因此, 这段代码持行后 a = 6, b = 7, c = 12。 如果你知道答案,或猜出正确答案,做得好。如果你不知道答案,我也不把这个当作问题。我发现这个问题的最大好处是这是一个关于代码编写风格,代码的可读性,代码的可修改性的好的话题。 好了,伙计们,你现在已经做完所有的测试了。这就是我出的 C 语言测试题,我怀着愉快的心情写完它,希望你以同样的心情读完它。如果是认为这是一个
14、好的测试,那么尽量都用到你的找工作的过程中去吧。天知道也许过个一两年,我就不做现在的工作,也需要找一个。 作者介绍: Nigel Jones 是一个顾问,现在住在 Maryland,当他不在水下时,你能在多个范围的嵌入项目中找到他。 他很高兴能收到读者的来信,他的 email 地址是: NAJ 参考文献 1) Jones, Nigel, “In Praise of the #error directive,“ Embedded Systems Programming, September 1999, p. 114. 2) Jones, Nigel, “ Efficient C Code for
15、 Eight-bit MCUs ,“ Embedded Systems Programming, November 1998, p. 66. 考查嵌入式 C 开发人员的最好的 0x10 道题考查一个初级嵌入式系统开发人员的 C 基本功,附有答案题目由资深嵌入式系统专家拟定,目的是考查入门级的嵌入式软件开发人员 Gavin Shaw 提供详细解答编者按:非常基本关于 C 语言的问题 ,一个信息类(计算机,资讯工程,电子工程, 通信工程)专业的本科毕业生应该达到的水平。题目不难,全部都能快速地答完,当然也需要一定的知识储备。对于大多数人,我们预期你可能答错 3) 4) 15)题,所以答错 3 道以
16、内的,我们认为你很棒答错 5 道题以内,我们认为你还不错(你还可能答错第 9 题)如果你有 6 道以上的题目不能答对,基本上我们都不好说什么了约定:1) 下面的测试题中,认为所有必须的头文件都已经正确的包含了2)数据类型 char 一个字节 1 byteint 两个字节 2 byte (16 位系统,认为整型是 2 个字节)long int 四个字节 4 bytefloat 四个字节 4 byetdouble 八个字节 8 bytelong double 十个字节 10 bytepointer 两个字节 2 byte(注意,16 位系统,地址总线只有 16 位)第 1 题: 考查对 volatile 关键字的认识#includestatic jmp_buf buf;main() volatile int b;b =3;i