答案:B, C
23、关于以太网中的ARP协议,描述错误的是: A) 根据IP地址查询其对应的MAC地址
B) 根据MAC地址查询其对应的IP地址,便于IP通信
C) 通过ARP协议产生的IP和MAC地址的映射,超时会淘汰 D) ARP请求中的MAC地址为广播地址
答案:B
24、关于TCP、UDP及其上层的应用,描述错误的是: A)TCP协议面向连接的,UDP协议是面向无连接的
B) UDP不保证数据的可靠传送,而文件的传递时要求必须无错传送的,因而所有基于文件传递的应用都不能基于UDP,如:TFTP C) telnet是基于TCP的终端应用,连续输入的多个字符可能会被封装到一个TCP包中
D) 在同一个节点上,基于TCP和UDP的应用端口号可以重叠
答案:B
改错题
1、请指出下面程序的错误 unsigned char i = 10; char b = 100; char *p
void f(void) {
while(--i >= 0) {
*(p++) = b; } }
参考答案:
(1) p没有分配空间
(2) i是无符号型,自减操作会引发死循环
2、下面函数要实现打印hello world的功能,请问程序中有何错误? void* GetMemory() {
char str[] = \; return str; }
void Test() {
char *str = NULL;
str = (char*) GetMemory(); printf(str); }
参考答案:
(1) GetMemory函数返回的地址内容已经被释放。
(2)str是指针,printf(str)打印的是地址,正确的是printf(*str)
3、请问如下代码有什么错误? #define MAX_SIZE 1000 #define NULL 0 #define TRUE 1 #define FALSE 0 struct XXX {
unsigned short a; unsigned short b; };
int demo(struct XXX *p, unsigned long size) {
struct XXX *temp;
temp=(struct XXX*)malloc(sizeof(struct XXX)*MAX_SIZE); if (NULL == temp) {
return FALSE; }
memcpy(temp, p, sizeof(struct XXX)*size);
/*其他操作*/
free (temp); return TRUE; }
参考答案:
(1) size可能大于MAX_SIZE,缺少安全检查
(2)p指针未作安全检查
4、如下程序用于把“blue”字符串返回,请指出其中的错误。 char *GetBlue() {
char* pcColor; char* pcNewColor;
pcColor = \;
pcNewColor = (char*)malloc(strlen(pColor)); strcpy(pcNewColor, pcColor);
return pcNewColor; }
参考答案:
(1) pcColor没有结束符,导致strcpy错误
(2) pcNewColor分配的长度应该再加1,用来放结束符’\\0’
5、请问如下程序段有什么错误? main() {
unsigned long i = 0, *p, *p1;
p = (unsigned long *)malloc(10000); p1 = p;
for(i = 0; i < 9999; i++) {
*p1 = 0x100; p1++; }
/*其他操作*/
free(p); }
参考答案:
(我找不到明显错误,要么是main函数没有指定返回值类型?)
编程题
1、对称数判断问题 请编写一段程序,判断一个正整数是否为对称数(对称数即左右对称的数字,
如3、22、121、1331、34543等),不允许利用C语言将数字转换为字符转的库函数。
参考答案:
bool judgeNumberSymmetry(unsigned long ulNumber) {
unsigned long ulTemp = ulNumber;/*src copy*/ unsigned long ulResult = 0; int iMod = 0;
while (ulTemp) {
iMod = ulTemp % 10;
ulResult = ulResult * 10 + iMod; ulTemp /= 10; }
if (ulNumber == ulResult) {
return true; } else {
return false; } }
2、排队队列问题
n个人,排成1队,(p1,p2,p3...pn)从第一个人开始从1报数,报数到3的人离开队列,队列里的下一个人继续从1开始报数,以此反复,当数到队列尾时,从队列头部继续报数,这样周而复始,知道队列剩一人。 给一个简单的例: 报数结果如下:
1,2,4,5,7,第一轮,3、6离开队列,7报数1,然后从队列头部继续报数,那么第一个人报数2,如此1,4,5,这样第二轮,位置2和位置7离开队列,并且从队列头部继续报数,第一个人报数1,因为队列尾部的7恰好报数到3.
1,2,这样第三轮,5被淘汰;
然后开始位置1的人报数1,最后位置1正好报数3,于是离开队列,最后剩下的人是2。
这样给定7个人,原始位置2的人是剩下的人。
请事先一个简单程序,实现上述问题,程序输入n,输出那个最后剩下的人的原始位置。 参考答案:(仅提供算法伪代码)
/*use queue*/ int getLast() {
int iCur = 1; int iPop;
while (que.head != que.tail) {
iCur++;
iPop = que.pop() if (3 != iCur) {
que.push(iPop); } else {
iCur = 1; } }
iPop = que.pop(); return iPop; }