推荐几道C语言笔试题,测试你的C语言功底
2008-07-11 18:13
204 查看
1、如何在下面的test函数里加入代码可以使程序运行起来输入和输出的相等?
(环境是vc6Debug方式下)
#include<stdio.h>
void test()
{
int t;
scanf("%d",&t);
//在这里加入代码
}
void main()
{
int m;
test();
printf("m=%d",m);
}
答案:
//在这里加入代码
*(&t + 22) = t;
debug该程序,记录变量m的地址和变量t的地址,两者相减得88(byte)。于是取t的地址加22(指针为int*型),得到m的地址。然后通过该指针将m的值设成t的值。注意两变量地址的差值与编译器分配栈空间的方式有关,只能通过debug看出来。如果改成release模式,该值会有变化。另外内嵌汇编也是可以做到,原理一样。
2、请运行下面的代码,观察结果,有人说怎么是死循环,你同意吗?为什么?
#include <stdio.h>
int main()
{
int i = 0;
int name[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
for (i = 0; i <= 10; i++)
{
name[i] = 0;
printf("ok/n");
}
return 0;
}
答案:
看到该题第一反应是i<=10写错了,应该是i<10。那么为什么写成i<=10就会死循环呢?
由于编译器先分配变量i的空间,然后紧接着分配数组name[10]的空间,两者栈空间是紧邻的。因此name[0]~name[9]是name的空间,name[10]的地址其实就是i的地址,只不过它们名字不同罢了(memory alias)。循环至i=10时,name[i] = 0这条语句其实是将i值改为了0。此时i为0,循环结束时判断i<=10显然条件满足,于是循环又回到i=0继续执行。如
此往复便成了死循环。
3、实现多参函数
大家对C语言中最熟悉的函数就是“printf”吧?这是在HelloWorld例子里就见过了。那么你真正了解它吗?请设计一个类似于printf的函数的多参函数int Add(…);这个函数的功能:
例如Add(4, 5, 0); 返回9
Add(4, 5, 6, 0);返回15…………可以输入大于0个参数(参数类型为整型)。
答案:
#include <stdarg.h>
int Add(int a, ...)
{
int sum = a;
int temp;
va_list arg_ptr;
va_start(arg_ptr, a);
while(temp = va_arg(arg_ptr, int))
{
sum += temp;
}
va_end(arg_ptr);
return sum;
}
需要注意的是,在调用实际参数可变的函数时,必须由调用者显式指定实际参数的个数,比如这里的Add就是指定最后一个参数为0来指定实际参数的结束,而printf是通过第一个参数中输出格式的定义来确定实际参数的个数。否则可变参数的函数将无法实现。大家可以试试看,如果传入的最后一个实参不是0,结果会是怎样?
(环境是vc6Debug方式下)
#include<stdio.h>
void test()
{
int t;
scanf("%d",&t);
//在这里加入代码
}
void main()
{
int m;
test();
printf("m=%d",m);
}
答案:
//在这里加入代码
*(&t + 22) = t;
debug该程序,记录变量m的地址和变量t的地址,两者相减得88(byte)。于是取t的地址加22(指针为int*型),得到m的地址。然后通过该指针将m的值设成t的值。注意两变量地址的差值与编译器分配栈空间的方式有关,只能通过debug看出来。如果改成release模式,该值会有变化。另外内嵌汇编也是可以做到,原理一样。
2、请运行下面的代码,观察结果,有人说怎么是死循环,你同意吗?为什么?
#include <stdio.h>
int main()
{
int i = 0;
int name[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
for (i = 0; i <= 10; i++)
{
name[i] = 0;
printf("ok/n");
}
return 0;
}
答案:
看到该题第一反应是i<=10写错了,应该是i<10。那么为什么写成i<=10就会死循环呢?
由于编译器先分配变量i的空间,然后紧接着分配数组name[10]的空间,两者栈空间是紧邻的。因此name[0]~name[9]是name的空间,name[10]的地址其实就是i的地址,只不过它们名字不同罢了(memory alias)。循环至i=10时,name[i] = 0这条语句其实是将i值改为了0。此时i为0,循环结束时判断i<=10显然条件满足,于是循环又回到i=0继续执行。如
此往复便成了死循环。
3、实现多参函数
大家对C语言中最熟悉的函数就是“printf”吧?这是在HelloWorld例子里就见过了。那么你真正了解它吗?请设计一个类似于printf的函数的多参函数int Add(…);这个函数的功能:
例如Add(4, 5, 0); 返回9
Add(4, 5, 6, 0);返回15…………可以输入大于0个参数(参数类型为整型)。
答案:
#include <stdarg.h>
int Add(int a, ...)
{
int sum = a;
int temp;
va_list arg_ptr;
va_start(arg_ptr, a);
while(temp = va_arg(arg_ptr, int))
{
sum += temp;
}
va_end(arg_ptr);
return sum;
}
需要注意的是,在调用实际参数可变的函数时,必须由调用者显式指定实际参数的个数,比如这里的Add就是指定最后一个参数为0来指定实际参数的结束,而printf是通过第一个参数中输出格式的定义来确定实际参数的个数。否则可变参数的函数将无法实现。大家可以试试看,如果传入的最后一个实参不是0,结果会是怎样?
相关文章推荐
- C语言字符串库函数的实现也是笔试题常考的题目,以下代码没有严格测试,只是简单的实现:
- 几道经典的嵌入式C语言笔试题
- 几道C++笔试题,看看你的功底如何
- 测试你的C语言功底?
- 几道经典的嵌入式C语言笔试题
- 神州数码软件测试工程师笔试C语言题目详解
- [推荐]C语言测试:想成为嵌入式程序员应知道的0x10个基本问题
- 几道C语言笔试题及个人理解
- 几道经典的嵌入式C语言笔试题
- 几道经典的嵌入式C语言笔试题
- 几道经典的嵌入式C语言笔试题
- C语言测试题目解答:微软一道笔试题,2005年华为招聘
- ZZ测试你的C语言功底?
- 软件测试笔试常见问题(1)
- C语言笔试题(15)——atoi函数实现
- C语言测试
- 几道创新工场2014笔试题
- C语言笔试题(16)——二叉树基本算法
- C语言笔试题(18)——strcat函数实现
- 从几道腾讯笔试题谈数组名与指针的思考