C语言笔试面试题技巧Word下载.docx
- 文档编号:6798272
- 上传时间:2023-05-07
- 格式:DOCX
- 页数:19
- 大小:22.89KB
C语言笔试面试题技巧Word下载.docx
《C语言笔试面试题技巧Word下载.docx》由会员分享,可在线阅读,更多相关《C语言笔试面试题技巧Word下载.docx(19页珍藏版)》请在冰点文库上搜索。
建立状态。
(确认位位1)
三、TCP/IP通信阻塞和非阻塞?
阻塞:
当socket的接收缓冲区中没有数据时,read调用会一直阻
塞住,直到有数据到来才返回。
当socket缓冲区中的数据量小于期望读取
的数据量时,返回实际读取的字节数。
当socket的接收缓冲区中的数据大于
期望读取的字节数时,读取期望读取的字节数,返回实际读取的长度。
非阻塞:
socket的接收缓冲区中有没有数据,read调用都会立刻返回。
接收
缓冲区中有数据时,与阻塞socket有数据的情况是一样的,如果接收缓冲区
中没有数据,则返回错误号为EWOULDBLOCK,表示该操作本来应该阻塞的,但
是由于本socket为非阻塞的socket,因此立刻返回,遇到这样的情况,可
以在下次接着去尝试读取。
如果返回值是其它负值,则表明读取错误。
因此,非阻塞的rea调用一般这样写:
if((nread=read(sock_fd,buffer,len))<
0)
{
if(errno==EWOULDBLOCK)
return0;
//表示没有读到数据
}
else
return-1;
//表示读取失败
}elsereturnnread;
//读到数据长度
四、TCP/UDP区别?
TCP---传输控制协议,提供的是面向连接、可靠的字节流服务。
当客户和服务器
彼此交换数据前,必须先在双方之间建立一个TCP连接,之后才能传输数据。
TCP
提供超时重发,丢弃重复数据,检验数据,流量控制等功能,保证数据能从一端
传到另一端。
UDP---用户数据报协议,是一个简单的面向数据报的运输层协议。
UDP不提供可靠
性,它只是把应用程序传给IP层的数据报发送出去,但是并不能保证它们能到达
目的地。
由于UDP在传输数据报前不用在客户和服务器之间建立一个连接,且没有
超时重发等机制,故而传输速度很快
五、林锐内存思考?
(1)
voidGetMemory(char*p)
p=(char*)malloc(100);
voidTest(void)
char*str=NULL;
GetMemory(str);
strcpy(str,"
helloworld"
);
printf(str);
答:
程序崩溃因为GetMemory并不能
传递动态内存,Test函数中的str一
直都是NULL
将使程序崩溃
(2)
char*GetMemory(void)
charp[]="
;
returnp;
str=GetMemory();
可能是乱码因为GetMemory返回的
是指向栈内存的指针,该指针的地址
不是NULL,但其原现的内容已经被清
除,新内容不可知
(3)
voidGetMemory2(char**p,intnum)
*p=(char*)malloc(num);
GetMemory(&
str,100);
hello"
(1)能够输出hello
(2)内存泄漏没有free
(4)
voidTest(void)
char*str=(char*)malloc(100);
strcpy(str,hello);
free(str);
if(str!
=NULL)
strcpy(str,world);
篡改动态内存区的内容,后果难以
预料,非常危险因为free(str);
之后
str成为野指针,if(str!
=NULL)语句
不起作用
六、编写各种str函数?
strcpy函数
char*my_strcpy(char*dest,constchar*src)
char*temp;
assert(dest!
=NULL&
&
str!
=NULL);
while((*dest++=*src++)!
='
\0'
returntemp;
char*my_strcat(char*dest,constchar*stc)
while(*dest)
dest++;
while((*dest++=*stc++)!
charmy_strstr(constchar*str,charc)
for(;
*str!
=c;
str++)
if(*str=='
)
returnNULL;
else
returnstr;
intmy_strlen(constchar*str)
char*temp=str;
*temp!
temp++);
return(int)(temp-str);
void*my_memcpy(void*dest,constvoid*src,size_tcount)
char*temp_dest=(char*)dest;
char*temp_src=(char*)src;
assert(dest!
=NULL&
src!
while(count--)
*temp_dest++=*temp_src++;
returndest;
intmy_strcmp(char*str1,char*str2)
intret=0;
while((ret=*(unsignedchar*)str1-*(unsignedchar*)str2)&
*str1&
*str2)
str1++;
str2++;
if(ret<
ret=-1;
elseif(ret>
ret=1;
returnret;
七、链表操作
(1)逆序?
node*reverse_node(node*head)
node*record,*current;
if(head==NULL||head->
next==NULL)
returnhead;
current=head->
next;
head->
next=NULL;
while(current!
record=current->
current->
next=head->
next=current;
current=record;
(2)插入
node*add_node(node*head,node*data)
node*current=head;
while(current->
next!
current=current->
next=data;
data->
(3)删除
node*del_node(node*head,node*data)
node*pf,*pb;
pf=head->
while(pf!
pf->
data!
=data->
data)
pb=pf;
pf=pf->
if(pf->
data==data->
pb->
next=pf->
free(pf);
printf("
NOnode!
\n"
(4)单链表(非循环)倒数第4个元素?
思路:
让第一个元素先走四步,然后两个游标指针一起走。
node*Get_Node(node*head)
inti;
node*first=head;
node*back
=head;
for(i=0;
i<
4;
i++)
if(first->
Nodelessthanfour!
first=first->
while(first!
back=back->
returnback;
(5)如何找出链表中间元素?
让前一个指针每次走两步,后一个指针每次走一步。
node*Get_middle_node(node*head)
node*back=head;
next->
(6)删除一个无头单链表的一个节点(链表很长10万以上)?
把当前节点的下个节点数据拷贝到当前节点,然后删除下一个节点。
voiddel_node(node*del_node)
node*record=del_node->
node*current=del_node;
data=record->
data;
//数据拷贝,假设结构体数据为data
next=record->
//指针跳转
free(record);
(7)如何判断一个单链表是否有环?
我们用一个步长1和一个步长2的游标指针遍历链表,观察是否有两个游标相遇的时刻。
intjudge_list_circle(node*head)
while(first->
back->
if(first==back)
returntrue;
returnfalse;
八、两种排序法(冒泡排序、选择排序)
voidbubble(inta[],intn)
inti,j,temp;
n-1;
for(j=i+1;
j<
n;
j++)
if(a[i]>
a[j])
temp=a[i];
a[i]=a[j];
a[j]=temp;
voidchoise(inta[],intn)
inti,j,temp,min;
min=i;
if(j=i+1;
min=j;
if(min!
=i)
a[i]=a[min];
a[min]=temp;
九、字符串反转?
charstr_rev(char*str,size_tlen)
char*start=str;
char*end=str+len-1;
charch;
while(start<
end)
ch=*start;
*start++=*end;
*end--=ch;
十、关键字volatile有什么含意并给出三个不同的例子。
一个定义为volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会
去假设这个变量的值了。
精确地说就是,优化器在用到这个变量时必须每次都小心地重
新读取这个变量的值,而不是使用保存在寄存器里的备份。
下面是volatile变量的几个例子:
1)并行设备的硬件寄存器(如:
状态寄存器);
2)一个中断服务子程序中会访问到的非自动变量;
3)多线程应用中被几个任务共享的变量;
1)一个参数既可以是const还可以是volatile吗?
解释为什么。
2)一个指针可以是volatile吗?
3)下面的函数有什么错误:
intsquare(volatileint*ptr)
return*ptr
*
*ptr;
答案:
1)是的。
一个例子是只读的状态寄存器。
它是volatile因为它可能被意想
不到地改变。
它是const因为程序不应该试图去修改它。
2)是的。
尽管这并不很常见。
一个例子是当一个中断服务子程序修该一个指向一个buffer的指针时。
3)这段代码的目的是用来返指针*ptr指向值的平方,但是,由于*ptr指向
一个volatile型参数,编译器将产生类似下面的代码:
inta,b;
a=*ptr;
b=*ptr;
returna*b;
由于*ptr的值可能被意想不到地该变,因此a和b可能是不同的。
结果,这段代码可能返不是你所期望的平方值!
正确的代码如下:
longsquare(volatileint*ptr)
inta;
returna*a;
十一、内存分配应该注意什么问题?
1、检查内存分配是否成功。
2、内存生命周期,程序结束时记得free,避免内存泄露。
3、使用过程中避免指针越界访问,会导致不必要的错误。
十二、字符串回文判断?
intstr_is_resv(char*str)
{
int
len=strlen(str);
char*end
=str+len-1;
len/2;
if(*(start+i)!
=*(end-i))
十三、字符串循环左移?
//循环左移,库函数实现
char*str_rev1(char*str,intbit)
intlen=strlen(str);
intn=bit%len;
chartemp[128]="
"
strcpy(temp,str);
strncpy(str,str+n,len-n);
str[len-n]='
strncat(str,temp,n);
//循环左移,不用库函数
char*str_rev2(char*str,intbit)
chartemp_str[128];
inti,j;
intstr_len=strlen(str);
bit=bit%str_len;
bit;
*(temp_str+i)=*(str+i);
str_len-bit;
*(str+i)=*(str+bit+i);
for(j=0;
*(str+i+j)=*(temp_str+j);
十四、如何编程判断大小端?
/*返回1表示小端,返回0表示大端*/
intcheck_cpu_endian()
union
unsignedinta;
unsignedcharb;
}s;
s.a=1;
//0x01
return(s.b==1);
十五、如何判断一个字节(char)里面多少bit被置1?
intcount_bit(intvalue)
inti,count=0;
8;
if(value&
0x01==0x01)
count++;
value
=value>
>
0x01;
returncount;
十六、判断一个整数里面有多少个1?
intcount=0;
while(value)
value&
=value-1;
十七、二分法查找?
intmid_serach(intarry[],intkey,intsize)
intlow,high,mid;
low=0;
high=size-1;
while(low<
high)
mid=(low+high)/2;
if(key==arry[mid])
returnmid;
elseif(key<
arry[mid])
high=mid-1;
elseif(key>
low=mid+1;
十八、字符串转成十进制数?
intstr_to_int(char*str)
inttemp=0;
while(*str!
temp=temp*10+*str-'
0'
str++;
//temp=atol(str);
//库函数一步完成
十九、OSI模型分哪几层?
物理层、数据链路层、网络层、传输层、应用层、表示层、会话层
集线器hub工作在OSI参考模型的(物理)层;
网卡工作在OSI参考模型的(物理)层;
路由器router工作在OSI参考模型的(网络)层;
交换机Switch工作在OSI参考模型的(数据链路)层。
二十、给定某个整数n(0-10000),求小于等于n的整数中与7有关的整数
(被7整除或者数字中含有7,只要求求出个数,不用列觉出每一个数字)
intfun(intdata)
intfirst,second,third,four;
for(i=1;
=data;
first
=i%10;
second=i/1
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言 笔试 试题 技巧