c语言面试题.docx
- 文档编号:30170559
- 上传时间:2023-08-05
- 格式:DOCX
- 页数:62
- 大小:45.26KB
c语言面试题.docx
《c语言面试题.docx》由会员分享,可在线阅读,更多相关《c语言面试题.docx(62页珍藏版)》请在冰豆网上搜索。
c语言面试题
第一题:
写一个函数fn(),功能是传一个参数是字符串,查找里面有没有相同的字符,有的话返回1,否则0.两种方法,一是效率最高的,二是最节省内存的.
代码:
intfn0(constchar*str)
{
charnum[256]={0};
unsignedchar*pos=(unsignedchar*)str;
while(*pos!
=0&&num[*pos]==0){
num[*pos++]=1;
}
return*pos==0?
0:
1;
}
intfn1(constchar*str)
{
constchar*p1,*p2;
if(*str==0)
return0;
for(p1=str;*p1!
=0;p1++){
for(p2=p1+1;*p2!
=0;p2++){
if(*p1==*p2)
return1;
}
}
return0;
}
第二题:
编写一个函数subs(char*str)打印出str的所有子串(例如1234的子串包括:
1,2,3,4,12,13,14,23,24,34,123,234,1234)不能使用系统提供的有关字符处理的类库,库函数。
/*writedbykf701
#include
voidsubs(char*str){
unsignedlonglen=0;
inti,j,k;
char*ptr1,*ptr2;
for(ptr1=str;*ptr1!
=0;++ptr1)
++len;
for(i=1;i<=len;++i){
ptr1=str;
for(j=i;(len-(ptr1-str))>;=j;++ptr1){
k=j;
ptr2=ptr1;
while(k-->;0){
putchar(*ptr2);
++ptr2;
}
printf("\n");
}
}
}
intmain(intargc,char**argv){
subs(argv[1]);
exit(0);
}
第三题:
chara[]="abc";charb[]={'a','b','c'};数组a和数组b的长度那个大?
#include
#include
intmain(intargc,char*argv[])
{
chara[]="abc";
charb[]={'a','b','c'};
printf("sa=%d,sb=%d\n",strlen(a),strlen(b));
printf("ssa=%d,ssb=%d\n",sizeof(a),sizeof(b));
return0;
}
第四题:
面试经常遇到考const的问题,今天总结如下:
#include
usingnamespacestd;
intmain()
{
constchar*pa;
charconst*pb;
charca='a';
charcb='b';
char*constpc=&ca;
constchar*constpd=&cb;
pa=&ca;
pa=&cb;
pb=&ca;
pb=&cb;
*pc='d';
printf("ca=%c\n",ca);
return0;
}
经过以上测试
constchar*pa;
charconst*pb;
上面两种定义方法一样都是pa(pb)指向的变量的值不可改变,及*pa,*pb,而pa,和pb本身是可变的,如:
pa=&ca;//ok
×pa='c'//error
char*constpc=&ca;
pc本身是不可变的(只能在定义时初始化),但指向的变量值是可变的,如
pc=&ca;//error
*pc='d';//ok
constchar*constpd=&cb;
pd本身是不可变的,且指向的变量也是不可变的(只能在定义时初始化)
pd=&cb;//error
*pd='c';/error
通过以上总结,无论怎样定义p都是一指针
如果const在*左边,表示该指针指向的变量是不可变的
如果const在*右边,表示该指针本身是不可变得
第一部分:
1、intk=0;
while(k=1){k++;}
A:
循环一次
B:
循环无数次ok
C:
语法错误
D:
不循环
2、char*a="Hello";
char*b="Hello";
if(a==b)
cout<<"dklajkl" cout<<"akjgouo"<问输出? ? 3、class_Student { public: floata; charb; } _Studentstudent; student.a=3.5; student.b="A";string 问错误? ? ? 答案: 4、inti,a[5],*p=a; for(i=0;i<5;i++) {p++; *p=i; } 问错误? ? ? 答案: 第二部分: HereisaprograminANSIStandardC: doublesum,a[20]; inti; /* *Somecodetoinitializearrayawithlegitimate *floatingpointvalueswhosesumislessthan"maximumdouble". */ sum=0.0; for(i=0;i<20;i++) sum+=a[i]; printf("%e",sum); sum=0.0; i=20; while(i--) sum+=a[i]; printf("%e",sum); Question: Willthe2"printed"values: [相约加拿大: 枫下论坛] 1)alwaysbethesame? ifso,explainwhy. 2)alwaysbedifferent? ifso,explainwhy. 3)sometimesbethesameandsometimesdifferent? ifso,givean example. Pleasebeascompleteaspossible. 第三部分: 1.改错(5分) voidtest() { charstr[10]; char*str1="0123456789"; strcpy(str,str1); } 2.改错(5分) voidtest() { charstr[10],str1[10]; for(int=0;i<10;i++) { str[i]='a'; } strcpy(str,str1); } 3.读程序,写出结果(5分) intsum(inta) { intc=0; staticintb=3; c+=1; b+=2; return(a+b+c) } intmain() { inta=2; for(inti=0;i<5;i++) { printf("%d,",sum(a)); } return0; } 4.读程序,写出结果(5分) intmain() { inta[3]; a[0]=0; a[1]=1; a[2]=2; int*p,*q; p=a; q=&a[2]; intc=a[q-p]; printf("valuec=%d\n",c++); printf("valuec=%d\n",c); return0; } 5.读程序,写出结果(10分,选做) #defineSTRCPY(a,b)strcpy(a##_p,#b) intmain() { charvar1_p[20]; charvar2_p[30]; strcpy(var1_p,"aaaa"); strcpy(var2_p,"bbbb"); STRCPY(var1,var2); STRCPY(var2,var1); printf("var1=%s\n",var1_p); printf("var2=%s\n",var2_p); return0; } 6.(10分)不用除法(即不能使用"/"号)和库函数,计算285/16的商和余数,要求效率尽量高. 7.(15分)编写字符串反转函数: strrev.要求时间和空间效率都尽量高. (测试用例: 输入"abcd",输出应为"dcba") 函数原型为: char*strrev(char*dest,char*src); 提示: dest和src可能是同一个字符串. 8.(15分)编写将字符串转换成整数的函数atoi,只处理输入字符串仅由0-9,'-','+',和空格的情况. 函数原型为: intatoi(char*str); 提示: 如果字符串不能构成一整数,可以直接返回0.但是对于以空格开始的字符串应特殊处理. 9.(30分)编写一组单链表操作函数.链表的结构如下: structListNode { longid; structListNode*next; }; 链表节点以id的从小到大排列,当id相等时,节点顺序没有约定,谁在前都可以. 要求编写的函数有: 遍历函数: 返回cur下一个节点,如果没有更多的节点,返回0; structListNode*ListNext(structListNode*cur); 插入函数: 将newNode插入到head链表中,然后返回newNode的前一节点, 如果newNode已经在链表中,返回0. structListNode*ListInsert(structListNode*head,structListNode*newNode); 删除函数: 从head中删除theNode节点.返回theNode的前一节点. 如果theNode不在链表中,返回0; structListNode*ListRemove(structListNode*head,structListNode*theNode); 附加: 1、如何fork出4个进程 2、实现snprintf 1.是不是一个父类写了一个virtual函数,如果子类覆盖它的函数不加virtual,也能实现多态? virtual修饰符会被隐形继承的。 private也被集成,只事派生类没有访问权限而已 virtual可加可不加 子类的空间里有父类的所有变量(static除外) 同一个函数只存在一个实体(inline除外) 子类覆盖它的函数不加virtual,也能实现多态。 在子类的空间里,有父类的私有变量。 私有变量不能直接访问。 2.输入一个字符串,将其逆序后输出。 (使用C++,不建议用伪码) #include usingnamespacestd; voidmain() { chara[50];memset(a,0,sizeof(a)); inti=0,j; chart; cin.getline(a,50,'\n');
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言 试题