295d=(char*)dst;
296s=(char*)src;
297while(len>=4){
298*d++=*s++;
299*d++=*s++;
300*d++=*s++;
301*d++=*s++;
302len-=4;
303}
304while(len–){
305*d++=*s++;
306}
307}
308returndst;
309}
公司考试这种题目主要考你编写的代码是否考虑到各种情况,是否安全(不会溢出)
各种情况包括:
1、参数是指针,检查指针是否有效
2、检查复制的源目标和目的地是否为同一个,若为同一个,则直接跳出
3、读写权限检查
4、安全检查,是否会溢出
memcpy拷贝一块内存,内存的大小你告诉它
strcpy是字符串拷贝,遇到’\0′结束
/*memcpy───拷贝不重叠的内存块*/
voidmemcpy(void*pvTo,void*pvFrom,size_tsize)
{
void*pbTo=(byte*)pvTo;
void*pbFrom=(byte*)pvFrom;
ASSERT(pvTo!
=NULL&&pvFrom!
=NULL);//检查输入指针的有效性
ASSERT(pbTo>=pbFrom+size||pbFrom>=pbTo+size);//检查两个指针指向的内存是否重叠
while(size–>0)
*pbTo++==*pbFrom++;
return(pvTo);
}
华为面试题:
怎么判断链表中是否有环?
boolCircleInList(Link*pHead)
{
if(pHead==NULL||pHead->next==NULL)//无节点或只有一个节点并且无自环
return(false);
if(pHead->next==pHead)//自环
return(true);
Link*pTemp1=pHead;//step1
Link*pTemp=pHead->next;//step2
while(pTemp!
=pTemp1&&pTemp!
=NULL&&pTemp->next!
=NULL)
{
pTemp1=pTemp1->next;
pTemp=pTemp->next->next;
}
if(pTemp==pTemp1)
return(true);
return(false);
}
两个字符串,s,t;把t字符串插入到s字符串中,s字符串有足够的空间存放t字符串
voidinsert(char*s,char*t,inti)
{
memcpy(&s[strlen(t)+i],&s[i],strlen(s)-i);
memcpy(&s[i],t,strlen(t));
s[strlen(s)+strlen(t)]=’\0′;
}
1。
编写一个C函数,该函数在一个字符串中找到可能的最长的子字符串,且该字符串是由同一字符组成的。
char*search(char*cpSource,charch)
{
char*cpTemp=NULL,*cpDest=NULL;
intiTemp,iCount=0;
while(*cpSource)
{
if(*cpSource==ch)
{
iTemp=0;
cpTemp=cpSource;
while(*cpSource==ch)
++iTemp,++cpSource;
if(iTemp>iCount)
iCount=iTemp,cpDest=cpTemp;
if(!
*cpSource)
break;
}
++cpSource;
}
returncpDest;
}
2。
请编写一个C函数,该函数在给定的内存区域搜索给定的字符,并返回该字符所在位置索引值。
intsearch(char*cpSource,intn,charch)
{
inti;
for(i=0;ireturni;
}
一个单向链表,不知道头节点,一个指针指向其中的一个节点,问如何删除这个指针指向的节点?
将这个指针指向的next节点值copy到本节点,将next指向next->next,并随后删除原next指向的节点。
#include
voidfoo(intm,intn)
{
printf(“m=%d,n=%d\n”,m,n);
}
intmain()
{
intb=3;
foo(b+=3,++b);
printf(“b=%d\n”,b);
return0;
}
输出:
m=7,n=4,b=7(VC6.0)
这种方式和编译器中得函数调用关系相关即先后入栈顺序。
不过不同编译器得处理不同。
也是因为C标准中对这种方式说明为未定义,所以各个编译器厂商都有自己得理解,所以最后产生得结果完全不同。
因为这样,所以遇见这种函数,我们首先要考虑我们得编译器会如何处理这样得函数,其次看函数得调用方式,不同得调用方式,可能产生不同得结果。
最后是看编译器优化。
2.写一函数,实现删除字符串str1中含有的字符串str2.
第二个就是利用一个KMP匹配算法找到str2然后删除(用链表实现的话,便捷于数组)
/*雅虎笔试题(字符串操作)
给定字符串A和B,输出A和B中的最大公共子串。
比如A=”aocdfe”B=”pmcdfa”则输出”cdf”
*/
//Author:
azhen
#include
#include
#include
char*commanstring(charshortstring[],charlongstring[])
{
inti,j;
char*substring=malloc(256);
if(strstr(longstring,shortstring)!
=NULL)//如果……,那么返回shortstring
returnshortstring;
for(i=strlen(shortstring)-1;i>0;i–)//否则,开始循环计算
{
for(j=0;j<=strlen(shortstring)-i;j++){
memcpy(substring,&shortstring[j],i);
substring[i]=’\0′;
if(strstr(longstring,substring)!
=NULL)
returnsubstring;
}
}
returnNULL;
}
main()
{
char*str1=malloc(256);
char*str2=malloc(