c面试题库

时间:2020-11-08 09:07:43 面试问题 我要投稿

c面试题库

1、实现 strcmp
int StrCmp(const char *str1, const char *str2)
做是做对了,没有抄搞,比较乱
int StrCmp(const char *str1, const char *str2)
{
assert(str1 && srt2);
while (*str1 && *str2 && *str1 == *str2) {
str1++, str2++;
}
if (*str1 && *str2)
return (*str1-*str2);
elseif (*str1 && *str2==0)
return 1;
elseif (*str1 = = 0 && *str2)
return -1;
else
return 0;
}
int StrCmp(const char *str1, const char *str2)
{
//省略判断空指针(自己保证)
while(*str1 && *str1++ = = *str2++);
return *str1-*str2;
}
2、实现子串定位
int FindSubStr(const char *MainStr, const char *SubStr)
做是做对了,没有抄搞,比较乱
int MyStrstr(const char* MainStr, const char* SubStr)
{
const char *p;
const char *q;
const char * u = MainStr;
//assert((MainStr!=NULL)&&( SubStr!=NULL));//用断言对输入进行判断
while(*MainStr) //内部进行递增
{
p = MainStr;
q = SubStr;
while(*q && *p && *p++ == *q++);
if(!*q )
{
return MainStr - u +1 ;//MainStr 指向当前起始位,u 指向
}
MainStr ++;
}
return -1;
}
3、已知一个单向链表的头,请写出删除其某一个结点的算法,要求,先找到此结点,然后删除。
slnodetype *Delete(slnodetype *Head,int key){}中 if(Head->number==key)
{
Head=Pointer->next;
free(Pointer);
break;
}
Back = Pointer;
Pointer=Pointer->next;
if(Pointer->number==key)
{
Back->next=Pointer->next;
free(Pointer);
break;
}
void delete(Node* p)
{
if(Head = Node)
while(p)
}
4、有1,2,....一直到n的无序数组,求排序算法,并且要求时间复杂度为O(n),空间复杂度O(1),使用交换,而且一次只能交换两个数.(华为)
#include<iostream.h>
int main()
{
int a[] = {10,6,9,5,2,8,4,7,1,3};
int len = sizeof(a) / sizeof(int);
int temp;
for(int i = 0; i < len; )
{
temp = a[a[i] - 1];
a[a[i] - 1] = a[i];
a[i] = temp;
if ( a[i] == i + 1)
i++;
}
for (int j = 0; j < len; j++)
cout<<a[j]<<",";
return 0;
}
5、写出程序把一个链表中的接点顺序倒排
typedef struct linknode
{
int data;
struct linknode *next;
}node;
//将一个链表逆置
node *reverse(node *head)
{
node *p,*q,*r;
p=head;
q=p->next;
while(q!=NULL)
{
r=q->next;


q->next=p;
p=q;
q=r;
}
head->next=NULL;
head=p;
return head;
}
6、写出程序删除链表中的所有接点
void del_all(node *head)
{
node *p;
while(head!=NULL)
{
p=head->next;
free(head);
head=p;
}
cout<<"释放空间成功!"<<endl;
}
7、两个字符串,s,t;把 t 字符串插入到 s 字符串中,s 字符串有足够的空间存放 t 字符串
void insert(char *s, char *t, int i)
{
char *q = t;
char *p =s;
if(q == NULL)return;
while(*p!='\0')
{
p++;
}
while(*q!=0)
{
*p=*q;
p++;
q++;
}
*p = '\0';
}
8、写一个函数,功能:完成内存之间的'拷贝
memcpy source code:
void* memcpy( void *dst, const void *src, unsigned int len )
{
register char *d;
register char *s;
 if (len == 0)
 return dst;
 if (is_overlap(dst, src, len, len))
complain3("memcpy", dst, src, len);
 if ( dst > src ) {
 d = (char *)dst + len - 1;
 s = (char *)src + len - 1;
while ( len >= 4 ) {
*d-- = *s--;
 *d-- = *s--;
 *d-- = *s--;
*d-- = *s--;
len -= 4;
 }
while ( len-- ) {
*d-- = *s--;
 }
 } else if ( dst < src ) {
 d = (char *)dst;
 s = (char *)src;
 while ( len >= 4 ) {
 *d++ = *s++;
 *d++ = *s++;
 *d++ = *s++;
 *d++ = *s++;
 len -= 4;
 }
 while ( len-- ) {
 *d++ = *s++;
 }
 }
 return dst;
 }
9、公司考试这种题目主要考你编写的代码是否考虑到各种情况,是否安全(不会溢出)
各种情况包括:
1、参数是指针,检查指针是否有效
2、检查复制的源目标和目的地是否为同一个,若为同一个,则直接跳出
3、读写权限检查
4、安全检查,是否会溢出
memcpy 拷贝一块内存,内存的大小你告诉它
strcpy 是字符串拷贝,遇到'\0'结束
/* memcpy ─── 拷贝不重叠的内存块 */
void memcpy(void* pvTo, void* pvFrom, size_t size)
{
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);
}

【c面试题库】相关文章:

华为c语言笔试面试题题库11-09

2017二级c语言题库08-21

C/C++面试题目11-21

C,C++的几个面试题小集11-24

C C++面试笔试题目集锦11-15

英语面试常问题库汇总12-10

面试笔试题库03-22

一个C/C++编程面试题11-22

嵌入式C/C++面试题201611-12

护士面试笔试题库 02-14