LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 33067|回复: 155

我今天为招聘新员工出的C语言考题

[复制链接]
发表于 2003-6-17 19:51:22 | 显示全部楼层 |阅读模式
填空题目:
以下一段C程序,在基于IA32的操作系统上编译运行,将在屏幕上打印:var1=[   ],var2=[   ],var3=[   ]。
int main(void)
{
        int  var1=0;
        char var2=0;
        int  var3=0;
        char str_val1[]="24\n";
        char str_val2[]="32\n";
        char str_val3[]="48\n";
        sscanf(str_val1,"%d",&var1);
        sscanf(str_val2,"%d",&var2);
        sscanf(str_val3,"%d",&var3);
        printf("var1=%d,var2=%d,var3=%d\n",var1,var2,var3);
}
注:sscanf函数的功能类似scanf,用于从一个字符串输入中获取数据。

竟然没有人答对。不禁感慨万千。
发表于 2003-6-17 20:31:21 | 显示全部楼层
sscanf使用不是很多
所以没有接触C的不会用那也是正常
 楼主| 发表于 2003-6-17 21:08:06 | 显示全部楼层
这道题主要是考大家的C语言功底。
答案明显不是想象中的
var1=24,var2=32,var3=48
发表于 2003-6-17 21:15:12 | 显示全部楼层
会不会是
var1=98,var2=99,var3=100
?
sscanf是不是以第二个参数的形式将第一个参数的数据输出到第三个参数里?
发表于 2003-6-17 21:27:28 | 显示全部楼层
我编译的结果是:
0,32,48
而且发现在执行完对var2赋值的语句后var1的值会发生变化
没想明白这是怎么回事.
楼主解释一下?
 楼主| 发表于 2003-6-17 21:27:54 | 显示全部楼层
最初由 0100 发表
会不会是
var1=98,var2=99,var3=100
?
sscanf是不是以第二个参数的形式将第一个参数的数据输出到第三个参数里?

sscanf的功能是这样没错。

该题目就是将三个字符串里的数字相应地sscanf到var1,var2,var3里。
答案是:var1=0,var2=32,var3=48
发表于 2003-6-17 22:01:41 | 显示全部楼层
这个题不太好吧,不同的编译器可能有不同的结果,加上优化选项也可能有不同的结果,之所以有这样的结果是因为缓冲区溢出, sscanf(str_val2,"%d",&var2)中的var2是char,只占一个字节,当作为%d格式的时候实际写了4个字节,声明的时候var1在var2前面,所以就把var1覆盖了3个字节,这和机器堆栈的生长方向也有关,如果栈是向上生长的就没有这种效果,还和str_var的值有关,var1太大就不会被覆盖完(不等于0),var2太大就会影响var1(值不一定),如果编译的时候加了优化选项(gcc -O),作为速度优化,编译器会把变量按机器字对齐,也没有这种效果,总之,缓冲区溢出这种东西很麻烦,搞不清结果会是什么。
 楼主| 发表于 2003-6-17 22:18:15 | 显示全部楼层
最初由 libinary 发表
这个题不太好吧,不同的编译器可能有不同的结果,加上优化选项也可能有不同的结果,之所以有这样的结果是因为缓冲区溢出, sscanf(str_val2,"%d",&var2)中的var2是char,只占一个字节,当作为%d格式的时候实际写了4个字节,声明的时候var1在var2前面,所以就把var1覆盖了3个字节,这和机器堆栈的生长方向也有关,如果栈是向上生长的就没有这种效果,还和str_var的值有关,var1太大就不会被覆盖完(不等于0),var2太大就会影响var1(值不一定),如果编译的时候加了优化选项(gcc -O),作为速度优化,编译器会把变量按机器字对齐,也没有这种效果,总之,缓冲区溢出这种东西很麻烦,搞不清结果会是什么。

佩服。
出这道题的本意就是要应试的人了解指针和缓冲区的问题。
因为作为公司的笔试题,严谨性要求不是特别高。但需要每个做题目的人都能看得懂这段问题代码。
其实这段代码可能你写过,我写过,结果可能不是你预期的,也不是我预期的。大家在不经意间留下的这些隐患需要我们有雪亮的眼睛去观察,去发现。
今天来应试的几个“高级程序员”都毫不犹豫地24,32,48,让我颇感失望。
^_^,以后这道题目要增加限制,前提是不打开任何优化选项的条件下或者直接改成主观题,让应试者根据条件阐述原因。
发表于 2003-6-18 00:32:35 | 显示全部楼层
我基本同意 libinary 的观点。其实应试的人只要发现程序不妥就好了。
发表于 2003-6-18 01:00:00 | 显示全部楼层
佩服libinary兄
看来以后要好好学习C了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表