C常见面试题 王牌8 1 C 常见面试题 一、常见试题 1. 什么是平衡二叉树? 左右子树都是平衡二叉树,且左右子树的深度差值的绝对值不大于 1。 2. 堆栈溢出一般是由什么原因导致的? 没有回收垃圾资源。 3. IP 地址的编码分为哪俩部分? IP 地址由两部分组成,网络号和主机号。不过是要和“子网掩码”按位与上之后才能 区分哪些是网络位哪些是主机位。 4. 以下程序的输出结果是什么? #include main( ) {int i=0,a=0; while(i<20) { for(;;) {if((i%10)==0) break; else i--; } i+=11;a+=i; } printf("%d\n",a); } 二重循环执行时,先执行外层 while 循环,条件 i<20 成立,执行内层循环,判断 if 语 句的条件(i%10)==0 成立,则退出内层循环的执行,i=11,a=11;再判断外层循环的条件 C 从入门到精通 2 i<20 成立,执行内层循环,if 语句的条件(i%10)==0 不成立,执行 else 子句,i=10,继续 执行内层循环,条件(i%10)==0 成立,退出内层循环的执行,i=21,a=32,外层循环的条 件不成立,退出整个外层循环的执行。所以输出 a 值为 32。 5. 已知大写字母 A 的 ASCII 码是 65,小写字母 a 的 ASCII 码是 97,则用八进制表示的字符 常量’101’是什么? 字符 A。 6. 如下程序的输出结果是什么。 main( ) { int a[3][3]={{1,2},{3,4},{5,6}},i,j,s=0; for(i=1;i<3;i++) for(j=0;j<=i;j++)s+=a[i][j]; printf("%d\n",s); } 该程序的输出结果是 18。 7. 不能做 switch()的参数类型是: switch 的参数不能为实型。 8. 一语句实现 x 是否为 2 的若干次幂的判断。 int i = 512; cout << boolalpha << ((i & (i - 1)) ? false : true) << endl; 9. 什么是预编译 ?何时需要预编译? 情况 1:总是使用不经常改动的大型代码体。 情况 2:程序由多个模块组成,所有模块都使用一组标准的包含文件和相同的编译选 项。在这种情况下,可以将所有包含文件预编译为一个预编译头。 10. 以下代码中的两个 sizeof 用法有问题吗? void UpperCase( char str[] ) // 将 str 中的小写字母转换成大写字母 { C常见面试题 王牌8 3 for( size_t i=0; i 与 #i nclude "file.h"的区别? 前者是从 Standard Library 的路径寻找和引用 file.h,而后者是从当前工作路径搜寻并 引用 file.h。 17. 请说出 const 与#define 相比,有何优点? const 常量有数据类型,而宏常量没有数据类型。编译器可以对前者进行类型安全检 查。而对后者只进行字符替换,没有类型安全检查,并且在字符替换可能会产生意料不 到的错误。 有些集成化的调试工具可以对 const 常量进行调试,但是不能对宏常量进行调试。 18. 用预处理指令#define 声明一个常数,用以表明 1 年中有多少秒(忽略闰年问题) #define SECONDS_PER_YEAR (60 * 60 * 24 * 365)UL 19. 请问下面程序有什么错误? int a[60][250][1000],i,j,k; for(k=0;k<=1000;k++) for(j=0;j<250;j++) for(i=0;i<60;i++) a[i][j][k]=0; 把循环语句内外换一下 C常见面试题 王牌8 5 20. 关键字 static 的作用是什么? 这个简单的问题很少有人能回答完全。在 C 语言中,关键字 static 有三个明显的作用: 在函数体,一个被声明为静态的变量在这一函数被调用过程中维持其值不变。在模块内 (但在函数体外),一个被声明为静态的变量可以被模块内所用函数访问,但不能被模块 外其它函数访问。它是一个本地的全局变量。在模块内,一个被声明为静态的函数只可 被这一模块内的其它函数调用。那就是,这个函数被限制在声明它的模块的本地范围内 使用。 21. 写出 float x 与“零值”比较的 if 语句。 if(x>0.000001&&x<-0.000001) 22. 局部变量能否和全局变量重名? 能,局部会屏蔽全局。局部变量可以与全局变量同名,在函数内引用这个变量时,会 用到同名的局部变量,而不会用到全局变量。对于有些编译器而言,在同一个函数内可 以定义多个同名的局部变量,比如在两个循环体内都定义一个同名的局部变量,而那个 局部变量的作用域就在那个循环体内 23. do……while 和 while……do 有什么区别? 前一个循环一遍再判断,后一个判断以后再循环 24. C 语言可以"按引用传参"吗? 真的没有。严格地讲,C 语言总是按值传参。你可以自己模拟按引用传参,定义接受 指针的函数,然后在调用时使用&操作符。事实上,当你向函数传入数组时,编译器本质 上就是在模拟按引用传参。但是 C 没有任何真正等同于按引用传参或 C++引用参数的东 西。另一方面,类似函数的预处理宏可以提供一种"按名称传参"的形式。 25. *p++自增 p 还是 p 所指向的变量? 后缀++和--操作符本质上比前缀一元操作符的优先级高,因此*p++和*(p++)等价,它 自增 p 并返回 p 自增之前所指向的值。要自增 p 指向的值,则使用(*p)++,如果副作用的 顺序无关紧要也可以使用++*p。 C 从入门到精通 6 26. 设有以下说明和定义: typedef union {long i; int k[5]; char c;} DATE; struct data { int cat; DATE cow; double dog;} too; DATE max; 则语句 printf('%d',sizeof(struct date)+sizeof(max));的执行结果是什么? DATE 是一个 union, 变量公用空间. 里面最大的变量类型是 int[5], 占用 20 个字节. 所 以它的大小是 20。 data 是一个 struct, 每个变量分开占用空间. 依次为 int4 + DATE20 + double8 = 32。 所以结果是 20 + 32 = 52。 当然,在某些 16 位编辑器下,int 可能是 2 字节,那么结果 int2 + DATE10 + double8 = 20。 27. 以下程序输出的最后一个值是是什么? int ff(int n) { static int f=l; f=f*n; return f; } main( ) { int i; for(i=1;i<=5;i++ ) printf("%d\n",ff(i)); } 函数 ff 在循环中调用 5 次,第一次调用 ff(1),函数体执行,静态变量 f 的值为 1,执 行 1*n,返 回 值 为 1,第二次调用 ff(2),静态变量 f 的值保留第一次调用的值 1,执 行 1*n, 返回值为 2,依次类推,第五次调用 ff(5),f 保留第四次调用的值 24,执行 24*n=24*5=120, 返回值为 120。故输出值为 120。 28. 以下函数用来求出两整数之和,并通过形参将结果传回,请填空。 void func(int x,int y,______ z) { *z=x+y; } 要通过形参将结果传回,使用指针才能实现,存入的整数之和,所以变量 z 应定义为 整型指针类型 int *。 C常见面试题 王牌8 7 29. 给定程序中函数 fun 的功能是:求 k!(k<13),所求的阶乘的值作为函数值返回,例:若 k=10,则应输出:3628800。请改正 fun 程序中的错误,使它能得出正确的结果。 #include long fun(int k) {if (k>0) return(k*fun(k-1)); else if(k=0) return(1); } main( ) {int k=10; clrscr( ); printf("%d!=%d\n",k,fun(k)); } 将 if(k=0)改为 if(k==0)。 30. 关键字 const 有什么含意? 表示常量不可以修改的变量。 31. 数组和链表的区别 数组:数据顺序存储,固定大小。 连表:数据可以随机存储,大小可动态改变。 32. 已知一个数组 table,用一个宏定义,求出数据的元素个数 #define NTBL #define NTBL (sizeof(table)/sizeof(table[0])) 33. 有个读取直到 EOF 的简单程序,但是我如何才能在键盘上输入那个"\EOF"呢?我看中定 义的 EOF 是-1,是不是说我该输入-1? 考虑一下就知道,输入绝不能是-1,因为-1 是两个字符,而 getchar 每次读入一个字符。 事实上,在你的 C 程序中看到的 EOF 值和你在键盘上发出文件结束符的按键组合之间并 没有什么关系。EOF 不过是向程序发出的一个信号,指明输入不再有任何字符了,不论 什么原因(磁盘文件结束、用户结束输入、网络流关闭和 I/O 错误等。)根据你的操作系 统,你可能使用不同的按键组合来表示文件结束,通常是 Ctrl-D 或 Ctrl-Z。操作系统和标 C 从入门到精通 8 准输入输出库安排你的程序接收 EOF 值。 34. do……while 和 while……do 有什么区别? 前一个循环一遍再判断,后一个判断以后再循环。 35. 如何用 printf 实现可变的域宽度?就是在运行时确定宽度而不是使用%8d? 使用 printf("%*d", width, x)。格式说明符中的星号表示,参数列表中的一个 int 值用来 表示域的宽度。(注意,在参数列表中,宽度在输出的值之前。) 36. 为什么 printf()用%f 输出 double 型,而 scanf 却用%lf 呢? printf 的%f 说明符的确既可以输出 float 型又可以输出 double 型。float 型会被提升为 double 型。因此 printf()只会看到双精度数。对于 scanf,情况就完全不同了,它接受指针, 这里没有类似的类型提升。(通过指针)向 float 存储和向 double 存储大不一样,因此,scanf 区别%f 和%lf。 37. 有以下程序,程序运行后的输出结果是什么? float fun(int x,int y) { return(x+y);} main() { int a=2,b=5,c=8; printf("%3.0f\n",fun((int)fun(a+c,b),a-c)); } 输出结果是 9。 38. 写一个“标准”宏 MIN,这个宏输入两个参数并返回较小的一个。 #define MIN(A,B) ((A) <= (B) (A) : )) 39. C 语言中最简单的数据类型包括哪些? 整型、实型和字符型。 C常见面试题 王牌8 9 40. 如何在 printf 的格式串中输出一个'%'字符? 只需要重复百分号:%%。 二、程序题 1. 打印出所有的“水仙花数”,所谓“水仙花数”是指一个三位数,其各位数字立方和等于 该数本身。例如:153 是一个“水仙花数”,因为 153=1 的三次方+5 的三次方+3 的三次方。 利用 for 循环控制 100-999 个数,每个数分解出个位,十位,百位。以下是程序源代 码: #include main() { int i,j,k,n; printf("'water flower'number is:"); for(n=100;n<1000;n++) { i=n/100;/*分解出百位*/ j=n/10%10;/*分解出十位*/ k=n%10;/*分解出个位*/ if(i*100+j*10+k==i*i*i+j*j*j+k*k*k) { printf("%-5d",n); } } printf("\n"); } 2. 编程实现:找出两个字符串中最大公共子字符串,如'abccade','dgcadde'的最大子串为'cad' int GetCommon(char *s1, char *s2, char **r1, char **r2) { int len1 = strlen(s1); int len2 = strlen(s2); int maxlen = 0; C 从入门到精通 10 for(int k = 0; k < len1; k++) { for(int j = 0; j < len2; j++) { if(s1[k] == s2[j]) { int as = k, bs = j, count = 1; while(as + 1 < len1 && bs + 1 < len2 && s1[++as] == s2[++bs]) count++; if(count > maxlen) { maxlen = count; *r1 = s1 + k; *r2 = s2 + j; } } } } 3. 输入 N, 打印 N*N 矩阵 #define N 15 int s[N][N]; void main() { int k = 0, m = 0, j = 0; int a = 1; for( ; k < (N+1)/2; k++ ) { while( j < N-k ) s[m][j++] = a++; m++; j--; while( m < N-k ) s[m++][j] = a++; m--; j--; while( j > k-1 ) s[m][j--] = a++; m--; j++; while( m > k ) s[m--][j] = a++; m++; j++; } for( m = 0; m < N; m++ ) { for( j = 0; j < N; j++ ) cout << s[m][j] << ' '; C常见面试题 王牌8 11 cout << endl; } } 4. 给定程序中,编写函数 fun 的功能是:用“冒泡法”对输入的 10 个字符按由小到大的顺 序排序。 #include #define n 10 char str[n]; fun(char str[ ]) { } main( ) {int j,f; for(f=1;f==1;) {scanf("%s",str); if(strlen(str)>n) printf("超过长度,请重新输入!"); else f=0; } fun(str); for(j=0;j='a'&&str[i]<='z') str[i]=str[i]-32; fputc(str[i],fp); i++;} fclose(fp); } 6. 接收用户输入的数值,该数值表示某个字符的 ascii 码,使用 putchar()函数显示该字符。 void main() { char c; printf("请输入一个字符的 ASCII 码:" ); scanf("%d", &c); printf("该字符为:"); putchar©; putchar('\n'); } 7. 编写一个 c 语言程序,用于打印九九乘法表,格式如下: 1*1=1 2*1=2 2*2=4 3*1=3 3*2=6 3*3=9 一直到 9 void main() { int a=1,b; C常见面试题 王牌8 13 while(a<10) { b=1; while (b<=a) { printf("%d*%d=%d\t",a,b,a*b); b++; } printf("\n"); a++; } getch(); } 8. 输入一行字符,分别统计出其中英文字母,空格,数字和其他字符的个数。 main() { char c; int a=0,b=0,d=0,e=0,f=0; printf("请输入字符:"); do { c=getchar(); if(c>='A'&&c<='Z') a++; else if(c>='a'&&c<='z') b++; else if(c>='0'&&c<='9') d++; else if(c==' ') e++; else if((c>=33&&c<=47)||(c>=58&&c<=64)||(c>=93&&c<=96)||(c>=123&&c<=137)) f++; putchar©; }while(c!='\n'); printf("字母个数为:%d\n",a+b); C 从入门到精通 14 printf("数字个数为:%d\n",d); printf("空格个数为:%d\n",e); printf("其它字符个数为:%d\n",f); } 9. 输入一个正整数,求概述的阶乘。提示:n 的阶乘公式:n=1*2*3*4*……*(n-1)*n void main() { int a,b,c,d=0; scanf("%d",&a); for(;a>=1;a--) { c=a; for(b=1;b #include int main() { char str[] = 'ABCD1234efgh'; int length = strlen(str); char * p1 = str; char * p2 = str + length - 1; while(p1 < p2) { char c = *p1; *p1 = *p2; *p2 = c; C常见面试题 王牌8 15 ++p1; --p2; } printf('str now is %s\n',str); return 0; } 11. 请写一个 C 函数,若处理器是 Big_endian 的,则返回 0;若是 Little_endian 的,则返回 1 int checkCPU() { { union w { int a; char b; } c; c.a = 1; return (c.b == 1); } } 12. 输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。 利用 while 语句,条件为输入的字符不为'\n'. 程序源代码如下: #include main() {char c; int letters=0,space=0,digit=0,others=0; printf("please input some characters\n"); while((c=getchar())!='\n') { if(c>='a'&&c<='z'||c>='A'&&c<='Z') letters++; else if(c==' ') space++; else if(c>='0'&&c<='9') digit++; else C 从入门到精通 16 others++; } printf("all in all:char=%d space=%d digit=%d others=%d\n",letters, space,digit,others); } 13. 输入两个正整数 m 和 n,求其最大公约数和最小公倍数。 以下是利用辗除法实现的源代: #include main() { int a,b,num1,num2,temp; printf("please input two numbers:\n"); scanf("%d,%d",&num1,&num2); if(num1 ){ temp=num1; num1=num2; num2=temp; } a=num1;b=num2; while(b!=0)/*利用辗除法,直到 b 为 0 为止*/ { temp=a%b; a=b; b=temp; } printf("gongyueshu:%d\n",a); printf("gongbeishu:%d\n",num1*num2/a); }
还剩15页未读

继续阅读

下载pdf到电脑,查找使用更方便

pdf的实际排版效果,会与网站的显示效果略有不同!!

需要 5 金币 [ 分享pdf获得金币 ] 0 人已下载

下载pdf

pdf贡献者

yekang

贡献于2014-07-02

下载需要 5 金币 [金币充值 ]
亲,您也可以通过 分享原创pdf 来获得金币奖励!
下载pdf