西邮linux兴趣小组2023纳新题题解

西邮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
输出原因:
  1. printf函数的返回值为一个整数,其返回值为printf函数中的字符个数,故两次返回值为0&23
  2. 由于ptr0ptr1为两个字符类型的指针变量,根据指针变量的基本运算可知:
int diff = ptr0 - ptr1;

这行代码中diff变量接收的是指针变量ptr0和指针变量ptr1相减的返回值,由于两个指针变量指向的是不同的字符串,因此这两个指针变量相减的结果是未定义的,因此其结果为一个随机值;

3. 一切都翻倍了吗

  1. 请尝试解释一下程序的输出。
  2. 请谈谈对sizeof()和strlen()的理解吧。
  3. 什么是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转换为字符串

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值