C/C++ 笔试,难倒我哉

2023-05-16

  2012-6-27日下午,去了一个软件公司笔试面试,3道题目,都是 C 语言的编程题,题意简单明了,写起来好麻烦,而且是在纸上写的,平常习惯了写写改改,后来发现整个卷面乱的真不是给人看的。

  第一题:将n个文件合并到一个文件中,要求保存每个文件的文件名,文件长度,文件数据。函数签名 int fpack(const char *flist[], const char *dstfile); flist的形式 {"1.doc", "2.txt", "3.exe", NULL} 。第一题就难倒我了,首先是要读写二进制文件,fread, fwrite本身就用的不多,又有4个参数,参数 File * 在第一个还是在第四个常搞不清楚,且第二个参数和第三个参数容易混淆;文件长度要通过读文件数据才知道,那么文件头信息中的文件长度还不能一开始就写入,需要 fseek 来回定位,当时就直接看第2题和第3题了,最后回过头了,硬着头皮写完了这个函数,现在回来仔细想想当时写得真是漏洞百出啊,于是又重新写了一遍:

  


 1 #include <stdio.h>
 2 #include <string.h>
 3 
 4 struct SFile {  //  注意边界对齐,f_name[6] 与 f_name[8] 时,sizeof(SFile) 都等于12
 5     int f_len;  //  感觉 f_len 应该写在 f_name 前面比较好
 6     char f_name[8];
 7 };
 8 
 9 void print_buf(const char *buf, int len) {
10     for (int i = 0; i < len; ++i)
11         printf("%X", buf[i]);
12     puts("");
13 }
14 
15 int fpack(const char *flist[], const char *dstfile) {
16     int n = 0;
17     const char **p = flist;
18     char buf[1024];
19     int len = 0;
20     SFile file;
21 
22     for (; *p != NULL; ++p, ++n) ;  //  统计需要 pack 的文件个数
23 
24     FILE *pDst = fopen(dstfile, "wb");
25     if (pDst == NULL) {
26         puts("pDst fopen error!");
27         return -1;
28     }
29 
30     printf("n = [%d]\n", n);    //
31     fwrite(&n, sizeof(n), 1, pDst); //  文件前siezof(int)个字节保存文件的个数
32 
33     for (p = flist; *p != NULL; ++p) {  //  遍历每个文件
34         printf("f_name = [%s]\n", *p);
35         strcpy(file.f_name, *p);    //  构造结构体
36         file.f_len = 0;
37 
38         FILE *pf = fopen(*p, "rb"); //  打开文件
39         if (pf == NULL) {
40             puts("pf fopen error!");
41             fclose(pDst);
42             return -1;
43         }
44 
45         fseek(pDst, sizeof(SFile), SEEK_CUR);   //  跨越文件头信息,先写文件数据
46         while ((len = fread(buf, 1, 1024, pf)) > 0) {   //  注意不能写成 fread(buf, 1024, 1, pf),否则 len 为 0
47             printf("len = [%d]\n", len);    //
48             print_buf(buf, len);    //
49             file.f_len += len;  //  更新文件长度数据
50             fwrite(buf, 1, len, pDst);
51         }
52 
53         int sz1 = sizeof(SFile);
54         int sz2 = file.f_len;
55         printf("sz1 = [%d], sz2 = [%d]\n", sz1, sz2);   //
56         printf("fn = [%d], fl = [%d]\n", sizeof(file.f_name), sizeof(file.f_len));
57 
58         fseek(pDst, -(sz1 + sz2), SEEK_CUR);    //  回到写文件头信息的位置
59         fwrite(&file, sz1, 1, pDst);            //  写入头信息
60         fseek(pDst, 0, SEEK_END);               //  定位到文件尾,为下一个文件做准备
61 
62         fclose(pf); //  关闭当前文件
63     }
64 
65     fclose(pDst);   //  关闭目标文件
66     return 0;
67 }
68 
69 int main(int argc, char *argv[])
70 {
71     const char *s[8] = {"111.txt", "222.txt", "333.txt"};
72     const char *d = "d.txt";
73 
74     printf("iRet = %d\n", fpack(s, d));
75 
76     return 0;
77 }  

运行结果如下:

就算去掉注释,也最起码要50行,一面A4纸还真不一定能写下,何况纸上涂改是必然的。

 

  第三题:将一个带头结点的单链表转换成一个带头结点的双向循环链表,这个题目不仅要满足是双向链表,还要满足循环链表,从单链表直接跳了两步,但是和第一题、第二题比起来,对我来说或许还能折腾出来,于是就先写了此题,回来在机器来又找原来写了遍,测试了下基本没有出错,如下:


 1 #include <malloc.h>
 2 #include <stdio.h>
 3 
 4 struct Node {
 5     int data;
 6     Node *next;
 7 };
 8 
 9 struct BiNode {
10     int data;
11     BiNode *next;
12     BiNode *prev;
13 };
14 
15 BiNode *convert(const Node *head) {  //  假定内存足够,malloc不会失败
16     BiNode *pBh = (BiNode *)malloc(sizeof(BiNode)); //  双向循环链表头结点
17     pBh->data = 0;
18     pBh->next = pBh->prev = NULL;   //  默认置空
19 
20     BiNode *q = NULL;
21     Node *p = head->next;
22 
23     if (p != NULL) {   //  单链表不为空
24         q = (BiNode *)malloc(sizeof(BiNode));
25         q->data = p->data;
26         q->next = q->prev = q;  //  双向循环链表只有一个结点的时候,next 和 prev 均指向自己
27         pBh->next = pBh->prev = q;  //  头结点两个指针均指向第一个结点
28 
29         p = p->next;
30         for (; p != NULL; p = p->next) {    //  遍历单链表余下的结点
31             BiNode *t = (BiNode *)malloc(sizeof(BiNode));
32             t->data = p->data;
33             t->next = q->next;
34             t->prev = q;
35 
36             q->next = t;    //  原来的尾结点next指向新的尾结点
37             pBh->next->prev = t;    //  第一个结点prev指向新的尾结点
38 
39             q = t;  //  q 保持指向尾结点
40         }
41     }
42 
43     return pBh;
44 }
45 
46 void print_clockwise(const BiNode *h) {
47     const BiNode *p = h->next;  //  第一个结点
48     printf("data = [%d]\n", p->data);
49 
50     p = p->next;
51     for (; p != h->next; p = p->next)
52         printf("data = [%d]\n", p->data);
53 
54     puts("----");
55 }
56 
57 void print_anticlockwise(const BiNode *h) {
58     const BiNode *p = h->next;  //  第一个结点
59     printf("data = [%d]\n", p->data);
60 
61     p = p->prev;
62     for (; p != h->prev; p = p->prev)
63         printf("data = [%d]\n", p->data);
64 
65     puts("----");
66 }
67 
68 int main(void)
69 {
70     //  构造单链表
71     Node n[5];
72     Node *head = &n[0];
73     head->data = 0;
74     head->next = &n[1];
75     n[1].data = 1;
76     n[1].next = &n[2];
77     n[2].data = 2;
78     n[2].next = &n[3];
79     n[3].data = 3;
80     n[3].next = &n[4];
81     n[4].data = 4;
82     n[4].next = NULL;
83 
84     BiNode *pBh = convert(head);
85 
86     //  顺时针打印
87     print_clockwise(pBh);
88 
89     //  逆时针打印
90     print_anticlockwise(pBh);
91 
92     return 0;
93 }  

运行结果如下:

哗啦哗啦又是90行,A4纸很紧张啊~~!

转载于:https://www.cnblogs.com/nysanier/archive/2012/06/27/2566389.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C/C++ 笔试,难倒我哉 的相关文章

  • ros开启快速转发模式

    RB CCR设备开启FastTrack ip firewall filter add chain 61 forward action 61 fasttrack connection connection state 61 establish
  • ROS的脚本多拨

    ros设置单网卡拨多ADSL 使用vrrp 有些版本有问题 xff0c 使用5 2破解版本测试成功 1 创建100个vrrp 并绑定到wan口下 for i from 1 to 100 do 61 interface vrrp add co
  • zabbix4.0 相关的拓扑图及centos的虚拟配置

    zabbix的拓扑图相关资料 https blog 51cto com qicheng0211 1591073 zabbix配合 grafana zabbix 安装好后 参考 grafana 官方文档 https grafana com g
  • 通过TCP协议发送DNS请求

    通过TCP协议发送DNS请求的方法 文章出处 xff1a http www bingtech net wordpress 2011 04 233 下载dnsapi dll文件 然后到Google xff0c 搜索 替换系统文件 replac
  • PLC实现积分的计算方法

    以电机运行转速来计算电机运行圈数为例 在PLC中定义定时器中断 xff0c 中断时间设置为200ms 转载于 https www cnblogs com chenpan6227 p 11558647 html
  • PLC中相关量的斜坡控制

    转载于 https www cnblogs com chenpan6227 p 11558750 html
  • PLC中m法计算电机转速

    转载于 https www cnblogs com chenpan6227 p 11558715 html
  • oauth2.0+jwt 源码探究之旅

    oauth2 0协议是一种对外开放式协议 xff0c 主要用于第三方登录授权 例如 xff1a 在豆瓣官网点击用qq登录 以及微信的授权都是基于oauth2 0协议做的 oauth2 0的认证流程 xff08 A xff09 用户打开客户端
  • 读取 appsettings.json

    Appsettings json 配置 xff1a 个配置文件就是一个json文件 xff0c 并且是严格的json文件 xff0c 所有的属性都需要添加 引号 下图是一个常规的代码示例 xff1a 34 UrlString 34 34 U
  • OVN学习整理

    部署OVN网络拓扑 OVN 安装软件包 etc yum repos d CentOS OpenStack ocata repo yum list installed grep openvswitch openvswitch x86 64 1
  • 关于python写文件时的回车符

    测试环境Windows 回车符是0x0D和0x0A俩个字符 xff0c 在python中记为 39 r n 39 写文件时 xff0c 如果文件打开格式为 39 w 39 xff0c 39 n 39 就按照0D 0A写入了文件 xff0c
  • 《对软件工程课程的期望》

    自我介绍 xff1a 各位老师 xff0c 同学大家好 我是软件三班 李德帅 xff0c 大三了我希望通过这学期学习软件工程这门课 xff0c 拓展丰富自己的知识领域 xff0c 提升自己的对软件编程的思维和素质 xff0c 并且还要在与小
  • 软件工程概论作业1

    1需要网站系统开发需要掌握的技术 1 gt html与css网页开发基础 2 gt jsp语言 3 gt javaBean技术 4 gt servlet技术 5 gt 数据库的操作技术 2本次课堂测试的程序源代码 1 xff09 登陆页面
  • lisp填写明细表对话框_中望机械绘图中,明细表功能的试用技巧

    在机械设计过程中 xff0c 明细表 即 BOM表 是CAD设计图纸中的重要组成部分 xff0c 它包含了图纸中所有零件的类型 序号 名称 材料 代号 规格 数量以及重量等信息 xff0c 是指导物流部门和生产部门采购的关键文件 xff0c
  • Ubuntu16.04 中文乱码问题解决

    Ubuntu16 04 中文乱码问题解决 要适配一个服务 xff0c 用了mysql5 7的版本 xff0c 最新的Ubuntu适配起来头秃 xff08 直接用mysql8 0又出现jdbc接口修改的问题 xff09 xff0c 所以直接切
  • Centos 安装 kubectl kubelet kubeadm

    cat lt lt EOF gt etc yum repos d kubernetes repo kubernetes name 61 Kubernetes baseurl 61 https mirrors aliyun com kuber
  • 51单片机 中断控制蜂鸣器

    51单片机 中断控制蜂鸣器 单片机通过使用外部中断控制蜂鸣器 include lt reg51 h gt define uint unsigned int define uchar unsigned char 定义蜂鸣器连接的引脚 sbit
  • 正则表达式的分组

    一 概念 分组 我们已经提到了怎么重复单个字符 xff08 直接在字符后面加上限定符就行了 xff09 xff1b 但如果想要重复一个字符串又该怎么办 xff1f 你可以用小括号来指定子表达式 也叫做分组 xff0c 然后你就可以指定这个子
  • linux 触控板 不识别,关于Ubuntu下触摸板失灵的解决方法一例

    最近突然发现Ubuntu下触摸板失灵了 xff0c 从网上找方法 xff0c 什么换驱动 xff0c 改代码 xff0c 都试过了 xff0c 结果不仅没修好反而系统瘫了 后来看到有人说重启电脑 xff0c 我就一遍一遍重启 xff0c 还

随机推荐

  • 通达OA应用中心使用手册(脚本编写指南)

    脚本编写必备基础 1 1 什么是脚本 脚本是一段 PHP 代码 xff0c 可以被应用中心执行以实现特定功能 应用中心支持通过脚本实现以下功能 xff1a 自定义计算函数 自定义提取触发器 自定义回填触发器 编写脚本对于应用中心来说不是必须
  • 常用HTTP消息头

    Cache control Cache Control 是最重要的规则 这个字段用于指定所有缓存机制在整个请求 响应链中必须服从的指令 这些指令指定用于阻止缓存对请求或响应造成不利干扰的行为 这些指令通常覆盖默认缓存算法 缓存指令是单向的
  • 用rplidar建图 运行rbx1_nav/gmapping_demo.launch报错

    1 rplidar开启 2 turtlrbot bringup 3 运行 roslaunch rbx1 nav gmapping demo launch 报如下错误 xff1a MessageFilter target 61 odom Dr
  • FreeRTOS 和uCOS II的简单比较

    转载 xff1a http www viewtool com bbs forum php mod 61 viewthread amp tid 61 114 这是两种RTOS 现在粗略比较一下 freeRTOS比uCOS II优胜的地方 xf
  • ubuntu配置XManager可用

    前提 xff1a 确保XManager所在PC和ubuntu所在主机的网络可相互访问 一 配置ubuntu 1 安装gdm软件 sudo apt get install gdm 安装后配置成默认的light模式即可 2 查看是否已经安装 s
  • ROS 自定义消息类型

    引言 学习ROS的过程中 xff0c 在话题的发布与订阅之间 xff0c 我一直在思考 xff0c 我们能不能定义自己的话题名 xff0c 甚至在编写我们自己的ROS软件包时 xff0c 定义我们自己的消息类型 首先能不能定义自己的话题名
  • char ch= 中 什么意思java_问一下java里的char到底是什么

    我们上课用的联系学java的软件是readytoprogramJAVAIDE xff0c 学到char变量的时候出了点问题 xff0c 教材上教的是让我们输 xff1a charch1 ch2 ch3 ch1 61 c readChar c
  • 理科大学可能类似纹路里

    11月5日 xff0c 第二届上海市政府新闻办公室推出全新形象片 上海 恒新之城 xff0c 以更为开放 更求创新 更讲包容的姿态展示新时代的风采 xff0c 迎接的到来 开放 创新 包容已成为上海最鲜明的品格 xff0c 这种品格是新时代
  • 三星 S10 运行 Ubuntu 系统

    导读DeX 是一种模仿桌面操作系统的用户 UI 界面 xff0c 把支持 DeX 的三星手机用数据线连上外置显示器 xff0c 用户就可以获得一种类似桌面系统的使用体验 三星 S8 Note 8 S9 Note 9 S10 系列都支持 De
  • Ubuntu的妥协将支持精选的32位应用

    据外媒Tom 39 s hardware xff0c Ubuntu开发人员Canonical在早先的时候宣布Ubuntu 19 10将不再更新32位软件包和应用程序 xff0c 引来了诸多应用开发者的不满 现在 xff0c Ubuntu方面
  • Jdk升级到11引起的问题:程序包javax.xml.bind.annotation不存在

    Jdk升级到11引起的问题 xff1a 程序包javax xml bind annotation不存在 Jdk12 都发布了 xff0c 我也下载一个玩一玩吧 刚准备要下载 xff0c 发现之前已经下载了一个11 xff0c 那就11 吧
  • 车载系统测试-功能测试第一天

    一 混动车型测试前注意 1 踩刹车加启动按钮 xff0c 进入ok模式 xff0c OK模式下可以进行常规测试 xff1b 点击启动按钮进入acc on模式 xff1b 在ok模式下 xff0c 充电不可用时可以踩油门进行充电 xff1b
  • 去除office非正版提示的方法(转)

    又是office的问题 每次回家都碰到相关问题 这次是微软正版计划的认证 去百度一下发现是一个 34 Office 正版增值计划通知 KB949810 CHS 34 补丁的问题 症状是 打开Office中的相应组件如WORD xff0c 那
  • 在SQLSERVER中如何检测一个字符串中是否包含另一个字符串

    当charindex返回值大于0时则包含 为0不包含 select CHARINDEX 39 456 39 39 123456 39 SQL语句使用CHARINDEX函数 xff0c 来测试一个字符串中是否包含另一个字符串中的方法 xff1
  • vim全选,全部复制,全部删除

    全选 xff08 高亮显示 xff09 xff1a 按esc后 xff0c 然后ggvG或者ggVG 全部复制 xff1a 按esc后 xff0c 然后ggyG 全部删除 xff1a 按esc后 xff0c 然后dG 解析 xff1a gg
  • FTP命令收集

    FTP FTP命令是Internet用户使用最频繁的命令之一 xff0c 熟悉并灵活应用FTP的内部命令 xff0c 可以大大方便使用者 xff0c 并收到事半功倍之效 如果你想学习使用进行后台FTP下载 xff0c 那么就必须学习FTP指
  • 如何屏蔽Chrome新标签页中8个缩略图

    PS xff1a 该经验本源来百度 雨燕之子 技术流匠师 xff0c 然本文图片等整理均属原创 第一步 xff1a 安装扩展Stylish 第二步 xff1a 安装成功红写入新样式 xff0c 名称自己起个喜欢的就好 xff0c 代码内容
  • VNC 登录上去灰屏,没有shell脚本,鼠标变成X

    CenterOS 1 安装vncserver yum install tigervnc server y 2 vncpasswd 设置pwd 3 etc sysconfig vncservers VNCSERVER 61 34 1 root
  • 计算机编程之高级语言

    高级语言 High level programming language 相对于机器语言 machine language xff0c 是一种指令集的体系 这种指令集 xff0c 称机器码 machine code xff0c 是电脑的CP
  • C/C++ 笔试,难倒我哉

    2012 6 27日下午 xff0c 去了一个软件公司笔试面试 xff0c 3道题目 xff0c 都是 C 语言的编程题 xff0c 题意简单明了 xff0c 写起来好麻烦 xff0c 而且是在纸上写的 xff0c 平常习惯了写写改改 xf