1、写一段代码判断机器的字节序。
字节序有两种方法:
- 大端法:高位字节存放在内存低地址端,低位字节存放在内存的高地址端;
- 小端法:低位字节存放在内存低地址端,高位字节存放在内存的高地址端;
其中网络字节序采用的是大端法,而主机字节序则根据CPU的不同所采用的方法不一样,可以通过写一段代码来查看自己主机的字节序。
判断主机字节序的方法也有两种:
一是使用联合体,代码如下:
1. `typedef union{`
2. `unsigned short value;`
3. `unsigned char bytes[2];`
4. `}Test;`
5. `int check(void)`
6. `{`
7. `Test test;`
8. `test.value = 0x1234;`
9. `if (test.bytes[0] == 0x12 && test.bytes[1] == 0x34)`
10. `{`
11. `return 1;//大端`
12. `}`
13. `else if(test.bytes[0] == 0x34& test.bytes[1] == 0x12)`
14. `{`
15. `return 0;//小端`
16. `}`
17. `else`
18. `return -1;//此种情况表示不能使用该种方法识别字节序,比如short不是两个字节`
19. `}`
二是使用强制转换,代码如下:
1. `bool check(void)`
2. `{`
3. `unsigned short flag = 0x4321;`
4. `if ( *(unsigned char*)&flag == 0x21)`
5. `return true;//小端`
6. `else`
7. `return false;//大端`
8. `}`
2、placement new的使用
1. `//用于在已经分配好的内存上,再进行二次分配,实现如下:`
2. `//假设有类X,成员函数Do(),代码如下:`
3. `int main()`
4. `{`
5. `char *buf = new char[sizeof(X)];`
6. `X *x = new (buf) X;`
7. `x->Do();`
8. `x->~X(); //一定要主动调用析构函数去析构`
9. `delete []buf;`
10. `return 0;`
11. `}`
3、socket编程需调用那些函数?
发送和接收过程:
- tcp:socket(),bind(),listen(),accept(),read(),write()
- udp:socket(),bind(),recvfrom(),sendto(),close
4、二叉树的部分实现代码
1. `//定义二叉树结构`
2. `typedef struct Node{`
3. `int data;`
4. `struct Node* left;`
5. `struct Node* right;`
6. `}NODE;`
7. `//递归建立二叉树`
8. `void create(NODE* &Head)`
9. `{`
10. `Head = (NODE*)malloc(sizeof(NODE));`
11. `scanf(“%d”, &Head->data);`
12. `if (Head)`
13. `{`
14. `create(Head->left);`
15. `create(Head->right);`
16. `}`
17. `}`
18. `//先序遍历`
19. `void Preorder(NODE *T)`
20. `{`
21. `if (T)`
22. `{`
23. `printf(“%d\n”, T->data);`
24. `Preorder(T->left);`
25. `Preorder(T->right);`
26. `}`
27. `}`
5、写代码实现旋转字符串,例如:abcdefg->efgabcd
1. `void ReversionString(char* s, int from, int to)`
2. `{`
3. `while(from < to)`
4. `{`
5. `char tmp = s[from];`
6. `s[from++] = s[to];`
7. `s[to--] = tmp;`
8. `}`
9. `}`
10. `void RotationString(char* s, int len, int m)`
11. `{`
12. `m = m%len;//TODO:考虑m比len大的情况`
13. `ReversionString(s, 0, m-1);`
14. `ReversionString(s, m, len-1);`
15. `ReversionString(s, 0, len-1);`
16. `}`
17. `//思路:要旋转的两部分先分别反转,然后整体反转,就实现了旋转字符串。`
6、给定两个分别由字符串组成的字符串A和字符串B,字符串B的长度比字符串A短。请问如何最快地判断字符串B中所有字符是否都包含在字符串A里。假设所有字符都是大小字母。
1. `bool stringContains(string &A, string &B)`
2. `{`
3. `int hase = 0;`
4. `for(int i=0;I < a.length();i++)`
5. `{`
6. `hash |= (1<<(a[i]-‘A’));//整数代替hasttable`
7. `}`
8. `for(int i=0;i<b.length();i++)`
9. `{`
10. `if ((hash & (1<<(b[i]-‘A’))) == 0)`
11. `{`
12. `return false;`
13. `}`
14. `}`
15. `return true;`
16. `}`
7、字符串转换成整数,输入字符串”123”, 输出整数123
1. `int strToInt(const char* str)`
2. `{`
3. `static const int max_int = (int)((unsigned)~0>>1);`
4. `static const int min_int = -(int)((unsigned)~0>>1)-1;`
5. `unsigned int n = 0;`
6. `if (str == NULL)`
7. `return 0;`
8. `while(isspace(*str)) //c库函数,检查字符是否为空格`
9. `++str;`
10. `int sign = 1;`
11. `if (*str == ‘+’ || *str == ‘-‘) //检查正负`
12. `{`
13. `if (*str == ‘-‘)`
14. `{`
15. `sign = -1;`
16. `}`
17. `++str;`
18. `}`
19. `while(isdigit(*str))`
20. `{`
21. `int c = *str-‘0’;`
22. `if (sign >0 && (n > max_int/10 || (n == max_int/10 && c > max_int%10)))`
23. `{`
24. `n = max_ing;`
25. `break;`
26. `}`
27. `else if( sign < 0 && (n > (unsigned)min_int/10 || (n == (unsigned)min_int/10 && c > (unsigned)min_int%10)))`
28. `{`
29. `n = min_int;`
30. `break;`
31. `}`
32. `n = n*10 + c;`
33. `++str;`
34. `}`
35. `return sign >0 ? n:-n;`
36. `}`
8、判断一个字符串是否是回文的,即一个顺着读和反着读都是一样的字符串,例如:madam
1. `bool IsPalindrone(const char* s, int n)`
2. `{`
3. `if (s == NULL || n < 1)`
4. `return false;`
5. `char* first, *second;`
6. `int m = (n/2-1) > 0?(n/2-1):0;`
7. `first = s+m;`
8. `second = s+n-1-m;`
9. `while(first >= s)`
10. `{`
11. `if (*first-- != *second++)`
12. `return false;`
13. `}`
14. `return true;`
15. `}`
9、int a=(int)(((int*)0)+4);问a的值是多少?
(int*)0定义一个指向0地址的整形指针,指针+4就是偏移到第四个整形地址的开头,那么该地址强制转换为int就是16(32位机器上)。
10、两个大整数相加,输入两个保存整数的字符串,输出他们的和的字符串
(1)先将两个字符串逆序保存到整形数组中
(2)整形数组同下标相加,放到第三个整形数组
(3)对第三个整形数组C[],如果C[i]>10,那么C[i] = C[i]-10,C[i+1] = C[i+1]+1;
(4)将第三个数组转换为字符串,输出。