西邮Linux兴趣小组2023纳新面试题
学长寄语:长期以来,西邮Linux兴趣小组的面试题以难度之高名扬西邮校内。我们作为出题人也清楚的知道这份试题略有难度。请你动手敲一下代码。别担心,若有同学能完成一半的题目,就已经十分优秀。其次,相比于题目的答案,我们对你的思路和过程更感兴趣,或许你的答案略有瑕疵,但你正确的思路和对知识的理解足以为你赢得绝大多数的分数。最后,做题的过程也是学习和成长的过程,相信本试题对你更加熟悉的掌握C语言的一定有所帮助。祝你好运。我们东区逸夫楼FZ103见!
- 本题目只作为西邮Linux兴趣小组2023纳新面试的有限参考。
- 为节省版面,本试题的程序源码省去了#include指令。
- 本试题中的程序源码仅用于考察C语言基础,不应当作为C语言「代码风格」的范例。
- 所有题目编译并运行于x86_64 GNU/Linux环境。
0. 鼠鼠我啊,要被祸害了
有1000瓶水,其中有一瓶有毒,小白鼠只要尝一点带毒的水,24小时后就会准时死亡。至少要多少只小白鼠才能在24小时内鉴别出哪瓶水有毒?
题解:
示例一:当只有一只老鼠时
当我们只有一只老鼠时,可以判断两瓶水是否有毒,我们可以用0
来表示有毒,1
来表示无毒,如果结果为0
,则表示小鼠尝的这瓶水就有毒,另一瓶水就无毒;
示例二:当有两只老鼠时
当我们有两只老鼠时,可以判断四瓶水(二的二次方)是否有毒,思路就是将四瓶水分别标上A,B,C,D
四个序号,小鼠1喝下A,B
两瓶水,小鼠2喝下B,C
两瓶水,从小鼠1和小鼠2的24小时后的存活情况可以得出有毒的水的序号;
依次类推………………
当有1000瓶水时:
由于2的10次方为1024,因此十只老鼠可以检测1024瓶水中哪瓶有毒,因此最少需要10只老鼠来进行检测;
1. 先预测一下~
按照函数要求输入自己的姓名试试~
char *welcome() {
// 请你返回自己的姓名
}
int main(void) {
char *a = welcome();
printf("Hi, 我相信 %s 可以面试成功!\n", a);
return 0;
}
代码如下:
#include<stdio.h>
char *welcome() {
return "name";
}
int main(void){
char *a = welcome();
printf("Hi, 我相信 %s 可以面试成功!\n", a);
return 0;
}
输出为:
Hi, 我相信 name 可以面试成功!
2. 欢迎来到Linux兴趣小组
有趣的输出,为什么会这样子呢~
int main(void) {
char *ptr0 = "Welcome to Xiyou Linux!";
char ptr1[] = "Welcome to Xiyou Linux!";
if (*ptr0 == *ptr1) {
printf("%d\n", printf("Hello, Linux Group - 2%d", printf("")));
}
int diff = ptr0 - ptr1;
printf("Pointer Difference: %d\n", diff);
}
这段代码的输出为:
Hello, Linux Group - 2023
Pointer Difference: 1431667684
输出原因:
printf
函数的返回值为一个整数,其返回值为printf
函数中的字符个数,故两次返回值为0&23
;- 由于
ptr0
和ptr1
为两个字符类型的指针变量,根据指针变量的基本运算可知:
int diff = ptr0 - ptr1;
这行代码中
diff
变量接收的是指针变量ptr0
和指针变量ptr1
相减的返回值,由于两个指针变量指向的是不同的字符串,因此这两个指针变量相减的结果是未定义的,因此其结果为一个随机值;
3. 一切都翻倍了吗
- 请尝试解释一下程序的输出。
- 请谈谈对sizeof()和strlen()的理解吧。
- 什么是sprintf(),它的参数以及返回值又是什么呢?
int main(void) {
char arr[] = {
'L', 'i', 'n', 'u', 'x', '\0', '!'}, str[20];
short num = 520;
int num2 = 1314;
printf("%zu\t%zu\t%zu\n", sizeof(*&arr), sizeof(arr + 0),
sizeof(num = num2 + 4));
printf("%d\n", sprintf(str, "0x%x", num) == num);
printf("%zu\t%zu\n", strlen(&str[0] + 1), strlen(arr + 0));
}
这段代码的输出为:
7 8 2
0
4 5
输出原因:
第一行:
第一行输出的3个数字分别代表了整个arr
数组,指向arr
数组首元素的指针以及被重新初始化了的短整型num
的大小,由于arr
数组中有7个字符而每个字符的大小均为1个字节,因此arr
数组的大小为7个字节;而指针类型与短整型的大小分别为8个字节和2个字节,因此第二个数字和第三个数字分别为8和2;
由于第一行每两个数字之间有一个转义字符\t
其代表水平制表符,即横向跳格,因此输出第一行;
第二行:
sprintf
函数:link;
这里的sprintf
函数起到了数字转字符串的作用,该函数将数字520
转换为字符串