① 本题目只作为西邮 Linux 兴趣小组 2023 纳新面试的有限参考。
② 为节省版面,本试题的程序源码省去了#include 指令。
③ 本试题中的程序源码仅用于考察 C 语言基础,不应当作为 C 语言「代码风格」的范例。
④ 所有题目编译并运行于 x86_64 GNU/Linux 环
0.鼠鼠我啊,要被祸害了
有 1000 瓶水,其中有一瓶有毒,小白鼠只要尝一点带毒的水,24 小时后就会准时死亡。
至少要多少只小白鼠才能在 24 小时内鉴别出哪瓶水有毒?
首先举个例子,4瓶水,给其编号00 01 10 11,两个小鼠,分别喝第一位为1的水,第二位为1的水,就可以判断出哪一瓶有毒,,8瓶水000 001 010 011 100 101 110 111,以此类推,需要三只小鼠,即2的10次方,需要10只小鼠。
1.先预测一下~
按照函数要求输入自己的姓名试试~
char *welcome() {
// 请你返回自己的姓名
}
int main(void) {
char *a = welcome();
printf("Hi, 我相信 %s 可以面试成功!\n", a);
return 0;
}
第一种
char *welcome() {
return "张三";
}
int main(void) {
char *a = welcome();
printf("Hi, 我相信 %s 可以面试成功!\n", a);
return 0;
}
第二种
char *welcome() {
char *arr="zhangsan";
return "zhangsan" ;
}
int main(void) {
char *a = welcome();
printf("Hi, 我相信 %s 可以面试成功!\n", a);
return 0;
}
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);
}
考点:printf的返回值
if (*ptr0 == *ptr1) 这个条件判断的是 ptr0 和 ptr1 所指向的字符串的第一个字符是否相同。由于两个字符串完全相同,因此条件为真。
printf(“%d\n”, printf(“Hello, Linux Group - 2%d”, printf(“”)));内层的 printf(“”) 调用返回0,由于格式化字符串中的 %d 被0替换,第二个 printf 实际上会打印 “Hello, Linux Group - 20”,并返回打印的字符数,然后,外层的 printf 会打印这个返回的字符数(即23)
打印
Hello, Linux Group - 2023
int 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