收藏 分销(赏)

c语言面试题攻略.doc

上传人:xrp****65 文档编号:6164250 上传时间:2024-11-28 格式:DOC 页数:12 大小:66KB
下载 相关 举报
c语言面试题攻略.doc_第1页
第1页 / 共12页
c语言面试题攻略.doc_第2页
第2页 / 共12页
点击查看更多>>
资源描述
C语言试题大全 试题1 · 1. 写一函数,实现删除字符串str1中含有的字符串str2.   /* 用递归做 */ void deletesubstr(char* str1, const char* str2) {          int len=strlen(str1);          char* newstr;          char* sp;          if(str1==NULL||str2==NULL)                return;          if(strlen(str1)<strlen(str2))                return;          if(sp=strstr(str1,str2))          {                 newstr=malloc(len+1);                 strncpy(newstr,str1,sp-str1);//保存str1中含有字符串str2以前的字符串                 strcpy(newstr+(sp-str),sp+strlen(str2));//将含有字符串str2以后的字符串保存                 strcpy(str1,newstr);                  free(newstr);                 deletesubstr(str1,str2);//递归继续查找删除存在的str2            }            else                 return; }   2.雅虎笔试题(字符串操作) 给定字符串A和B,输出A和B中的最大公共子串。 比如A="aocdfe" B="pmcdfa" 则输出"cdf"   答案: //Author: azhen #include<stdio.h> #include<stdlib.h> #include<string.h>   char *commanstring(char shortstring[], char longstring[]) {         int i, j;         char *substring=malloc(strlen(shortstring)+1);         if(strstr(longstring, shortstring)!=NULL) //如果……,那么返回shortstring                   return shortstring;         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)                            return substring;              }      }      return NULL; } 试题2 · 1. 请编写一个 C 函数,该函数在给定的内存区域搜索给定的字符,并返回该字符所在位置索引值。   答案: int search(char *cpSource, int n, char ch) { int i; for(i=0; i<n && *(cpSource+i) != ch; ++i); return i; }   2. 一个单向链表,不知道头节点,一个指针指向其中的一个节点,问如何删除这个指针指向的节点?   答案: 将这个指针指向的next节点值copy到本节点,将next指向next->next,并随后删除原next指向的节点。   3. 写一个函数比较两个字符串str1和str2的大小,若相等返回0,若str1大于str2返回1,若str1小于str2返回-1   答案: int strcmp ( const char * src,const char * dst) { int ret = 0 ; while( ! (ret = *(unsigned char *)src - *(unsigned char *)dst) && *dst)         { ++src;                 ++dst;         } if ( ret < 0 ) ret = -1 ; else if ( ret > 0 ) ret = 1 ; return( ret ); } 试题3 · 1.(1)读文件file1.txt的内容(例如):   12   34   56 输出到file2.txt:   56   34   12 (逆序) 答案: 注意可增长数组的应用. #include <stdio.h> #include <stdlib.h> int main(void) {       int MAX = 10;       int *a = (int *)malloc(MAX * sizeof(int));       int *b;           FILE *fp1;       FILE *fp2;       fp1 = fopen("a.txt","r");       if(fp1 == NULL)       {          printf("error1");          exit(-1);       }       fp2 = fopen("b.txt","w");       if(fp2 == NULL)       {          printf("error2");          exit(-1);       }     int i = 0;     int j = 0;     while(fscanf(fp1,"%d",&a[i]) != EOF)    {       i++;       j++;       if(i >= MAX)       {            MAX = 2 * MAX;            b = (int*)realloc(a,MAX * sizeof(int));            if(b == NULL)            {                printf("error3");                exit(-1);            }            a = b;     } } for(;--j >= 0;)    fprintf(fp2,"%d\n",a[j]); fclose(fp1); fclose(fp2); free(a); return 0; }     2. 分析下面的代码: char *a = "hello"; char *b = "hello"; if(a= =b) printf("YES"); else printf("NO"); "hello"是一个常量字符串。位于静态存储区,它在程序生命期内恒定不变。如果编译器优化的话,会有可能a和b同时指向同一个hello的。则地址相同。如果编译器没有优化,那么就是两个不同的地址,则不同   3. 两个字符串,s,t;把t字符串插入到s字符串的第i个位置前,s字符串有足够的空间存放t字符串   答案: void insert(char *s, const char *t, int i) {     int j,len;     int k=strlen(s)-1;     if(i<0||i>strlen(s))        return;     len=strlen(s)+strlen(t);     for(j=len-1;k>=i;k--,j--)      {        s[j]=s[k];     }     for(k=i;k<strlen(s)+i;k++)     {         s[k]=t[k-i];     }     s[len]='\0'; } 试题4 · 1.分析输出结果 int arr[] = {6,7,8,9,10}; int *ptr = arr; *(ptr++)+=123; printf(“ %d %d ”, *ptr, *(++ptr));   输出:8 8 过程:对于*(ptr++)+=123;先做加法6+123,然后++,指针指向7;对于printf(“ %d %d ”, *ptr, *(++ptr));从后往前执行,指针先++,指向8,然后输出8,紧接着再输出8     2 分析输出结果 void g(int**); int main() { int line[10],i; int *p=line;  for (i=0;i<10;i++) { *p=i; g(&p); //数组对应的值加1 } for(i=0;i<10;i++) printf("%d\n",line[i]); return 0; } void g(int**p) { (**p)++; (*p)++;// }     输出: 1 2 3 4 5 6 7 8 9 10     3 用递归算法判断数组a[N]是否为一个递增数组。   答案: 递归的方法,记录当前最大的,并且判断当前的是否比这个还大,大则继续,否则返回false结束: bool fun( int a[], int n ) { if( n= =1 ) return true; if( n= =2 ) return a[n-1] >= a[n-2]; return fun( a,n-1) && ( a[n-1] >= a[n-2] ); } 试题5 1. 分析: struct bit {   int a:3;     int b:2;     int c:3; }; int main() {   bit s;   char *c=(char*)&s;    cout<<sizeof(bit)<<endl;   *c=0x99;    cout << s.a <<endl <<s.b<<endl<<s.c<<endl;      int a=-1;    printf("%x",a);   return 0; } 输出是什么? 答案: 4 1 -1 -4 ffffffff 因为0x99在内存中表示为 100 11 001 , a = 001, b = 11, c = 100 当c为有符合数时, c = 100, 最高1为表示c为负数,负数在计算机用补码表示,所以c = -4;同理 b = -1; 当c为有符合数时, c = 100,即 c = 4,同理 b = 3 位域 :   有些信息在存储时,并不需要占用一个完整的字节,而只需占几个或一个二进制位。例如在存放一个开关量时,只有0和1 两种状态,用一位二进位即可。为了节省存储空间,并使处理简便,C语言又提供了一种数据结构,称为“位域”或“位段”。所谓“位域”是把一个字节中的二进位划分为几个不同的区域,并说明每个区域的位数。每个域有一个域名,允许在程序中按域名进行操作。这样就可以把几个不同的对象用一个字节的二进制位域来表示。一、位域的定义和位域变量的说明位域定义与结构定义相仿,其形式为:     struct 位域结构名     { 位域列表 };    其中位域列表的形式为: 类型说明符位域名:位域长度     例如:     struct bs    {    int a:8;    int b:2;    int c:6;    };    位域变量的说明与结构变量说明的方式相同。可采用先定义后说明,同时定义说明或者直接说明这三种方式。例如:     struct bs    {    int a:8;    int b:2;    int c:6;    }data;    说明data为bs变量,共占两个字节。其中位域a占8位,位域b占2位,位域c占6位。对于位域的定义尚有以下几点说明:    1. 一个位域必须存储在同一个字节中,不能跨两个字节。如一个字节所剩空间不够存放另一位域时,应从下一单元起存放该位域。也可以有意使某位域从下一单元开始。例如:     struct bs    {    unsigned a:4    unsigned :0 /*空域*/    unsigned b:4 /*从下一单元开始存放*/    unsigned c:4    }    在这个位域定义中,a占第一字节的4位,后4位填0表示不使用,b从第二字节开始,占用4位,c占用4位。    2. 由于位域不允许跨两个字节,因此位域的长度不能大于一个字节的长度,也就是说不能超过8位二进位。    3. 位域可以无位域名,这时它只用来作填充或调整位置。无名的位域是不能使用的。例如:     struct k    {    int a:1    int :2 /*该2位不能使用*/    int b:3    int c:2    };    从以上分析可以看出,位域在本质上就是一种结构类型,不过其成员是按二进位分配的。    二、位域的使用位域的使用和结构成员的使用相同,其一般形式为:位域变量名•位域名位域允许用各种格式输出。    main(){    struct bs    {    unsigned a:1;    unsigned b:3;    unsigned c:4;    } bit,*pbit;    bit.a=1;    bit.b=7;    bit.c=15;    2.int (*s[10])(int) 表示的是什么   答案: int (*s[10])(int) 函数指针数组,每个指针指向一个int func(int param)的函数。   3. c和c++中的struct有什么不同?   答案: c和c++中struct的主要区别是c中的struct不可以含有成员函数,而c++中的struct可以。c++中struct和class的主要区别在于默认的存取权限不同,struct默认为public,而class默认为private 最新C语言题 1. sizeof("")   是多少    sizeof("\0") 是多少   答案:1,2   2.class A { public:         virtual void  func(A &a)         {                 cout << "aa" << endl;         } }; class B:public A {          virtual void func(B &b)         {                 cout << "bb" << endl;         } }; int main() {    B b;    A &a = b;    a.func(b);   } 输出结果是什么 为什么?   答案: aa   3.struct C {         union ui         {                 char c;                 double d;         };         char a; }; struct D {         union         {                 char c;                 double d;         };         char a; };   sizeof(C) = ? sizeof(D) = ?   答案:1,16
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传
相似文档                                   自信AI助手自信AI助手

当前位置:首页 > 考试专区 > 其他

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2025 宁波自信网络信息技术有限公司  版权所有

客服电话:4009-655-100  投诉/维权电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服