关于5303狄惟佳同学的myod程序设计的补充实现
关于5303狄惟佳同学的myod程序设计的补充实现
原版代码实现的局限
- 原版代码主函数
int main(int argc,char *argv[])
{
if(strcmp(argv[1], "-tc")==0){
FILE *file=fopen(argv[3],"r");
tc(file);
}
if(strcmp(argv[2], "-tx1")==0){
FILE *file=fopen(argv[3],"r");
tx(file);
}
else if(strcmp(argv[2], "-to1")==0){
FILE *file=fopen(argv[3],"r");
to(file);
}
else if(strcmp(argv[2], "-td1")==0){
FILE *file=fopen(argv[3],"r");
td(file);
}
return 0;
}
- 通过阅读主函数,就可以知道本程序过于依赖argv的传参,而忽视argc的传参功能,从而导致本程序在用户使用上就成了,我只能按照
-tc -tx1 123.txt
或者-tc -to1 123.txt
这样的形式(即-tc必须在前,后面只能跟-tx1或者-to1,或者-td1)去输入,这就有点局限了,而linux上面真正是随便几个参数的输入,也随便顺序如何都可以按照用户的输入去调整输出形式,所以稍稍修改一下主函数之后是这样的
int main(int argc,char *argv[])
{
int i;
for(i=1;i<argc-1;i++){
if(strcmp(argv[i], "-tc")==0){
FILE *file=fopen(argv[argc-1],"r");
tc(file);
}
if(strcmp(argv[i], "-tx1")==0){
FILE *file=fopen(argv[argc-1],"r");
tx(file);
}
else if(strcmp(argv[i], "-to1")==0){
FILE *file=fopen(argv[argc-1],"r");
to(file);
}
else if(strcmp(argv[i], "-td1")==0){
FILE *file=fopen(argv[argc-1],"r");
td(file);
}
}
return 0;
}
- 第二个局限的地方就是后面用到的
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
函数里面的coord
值得设计了,如果只按照之前所说的,惟佳同学的设计,以及用户的“使用手则”的话,这样设初值是没有问题的,但如果主函数改变之后,就会出现行之间的覆盖的问题,这也就是光标设置错误导致的,下面是修改后的-tc函数的代码:
void tc(FILE *file,int n)
{
//Initialize the coordinates
COORD coord = {0, n};
//Set the position
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
char ch[18];
int i=0,j=0;
while(fgets(ch,17,file)!=NULL){
printf("%07o",16*j);
j++;
for(i=0;i<16;i++)
{
if(ch[i]=='\n')
{ i++;
putchar(' ');
printf("\\n");
}
if(ch[i]=='\0')
break;
putchar(' ');
putchar(' ');
printf("%c", ch[i]);
putchar(' ');
}
int k;
for(k=0;k<count;k++)
printf("\n");
}
printf("%07o",16*(j-1)+i);
fclose(file);
}
- 此时主函数也需要改变(增加了全局变量count,用来记录命令行传参的个数减一,方便后续的换行,以达信息到不被覆盖):
int count=0;
int main(int argc,char *argv[])
{
int i;
count=argc-2;
for(i=1;i<argc-1;i++){
if(strcmp(argv[i], "-tc")==0){
FILE *file=fopen(argv[argc-1],"r");
tc(file,i-1);
}
if(strcmp(argv[i], "-tx1")==0){
FILE *file=fopen(argv[argc-1],"r");
tx(file,i-1);
}
else if(strcmp(argv[i], "-to1")==0){
FILE *file=fopen(argv[argc-1],"r");
to(file,i-1);
}
else if(strcmp(argv[i], "-td1")==0){
FILE *file=fopen(argv[argc-1],"r");
td(file,i-1);
}
}
return 0;
}
- 后面的几个函数也和-tc差不多(详见附录一)
- 下面是几个运行截图:
附录一
- 修改后的源代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <windows.h>
#include <conio.h>
void tc(FILE *file,int n);
void tx(FILE *file,int n);
void to(FILE *file,int n);
void td(FILE *file,int n);
int count=0;
int main(int argc,char *argv[])
{
int i;
count=argc-2;
for(i=1;i<argc-1;i++){
if(strcmp(argv[i], "-tc")==0){
FILE *file=fopen(argv[argc-1],"r");
tc(file,i-1);
}
if(strcmp(argv[i], "-tx1")==0){
FILE *file=fopen(argv[argc-1],"r");
tx(file,i-1);
}
else if(strcmp(argv[i], "-to1")==0){
FILE *file=fopen(argv[argc-1],"r");
to(file,i-1);
}
else if(strcmp(argv[i], "-td1")==0){
FILE *file=fopen(argv[argc-1],"r");
td(file,i-1);
}
}
return 0;
}
void tc(FILE *file,int n)
{
//Initialize the coordinates
COORD coord = {0, n};
//Set the position
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
char ch[18];
int i=0,j=0;
while(fgets(ch,17,file)!=NULL){
printf("%07o",16*j);
j++;
for(i=0;i<16;i++)
{
if(ch[i]=='\n')
{ i++;
putchar(' ');
printf("\\n");
}
if(ch[i]=='\0')
break;
putchar(' ');
putchar(' ');
printf("%c", ch[i]);
putchar(' ');
}
int k;
for(k=0;k<count;k++)
printf("\n");
}
printf("%07o",16*(j-1)+i);
fclose(file);
}
void tx(FILE *file,int n)
{
//Initialize the coordinates
COORD coord = {0, n};
//Set the position
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
char ch[18];
int i;
while(fgets(ch,17,file)!=NULL){
printf(" ");
for(i=0;i<16;i++)
{
if(ch[i]=='\n')
{ i++;
printf("%3x ",'\n');
}
if(ch[i]=='\0')
break;
printf("%3x ",ch[i]);
}
int k;
for(k=0;k<count;k++)
printf("\n");
}
fclose(file);
}
void to(FILE *file,int n)
{
//Initialize the coordinates
COORD coord = {0, n};
//Set the position
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
char ch[18];
int i;
while(fgets(ch,17,file)!=NULL){
printf(" ");
for(i=0;i<16;i++)
{
if(ch[i]=='\n')
{ i++;
printf("%03o ",'\n');}
if(ch[i]=='\0')
break;
printf("%03o ",ch[i]);
}
int k;
for(k=0;k<count;k++)
printf("\n");
}
fclose(file);
}
void td(FILE *file,int n)
{
//Initialize the coordinates
COORD coord = {0, n};
//Set the position
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
char ch[18];
int i;
while(fgets(ch,17,file)!=NULL){
printf(" ");
for(i=0;i<16;i++)
{
if(ch[i]=='\n')
{ i++;
printf("%3d ",'\n');
}
if(ch[i]=='\0')
break;
printf("%3d ",ch[i]);
}
int k;
for(k=0;k<count;k++)
printf("\n");
}
fclose(file);
}
关于5303狄惟佳同学的myod程序设计的补充实现的更多相关文章
- 20155303狄惟佳预备作业三Linux学习笔记
20155303狄惟佳预备作业三Linux学习笔记 初次接触Ubuntu系统以及Linux内核,了解了其产生的历史,从感性来讲,深深吸引我的是其中蕴含的珍贵的开源精神,以及Stallman等人对&qu ...
- 201871010111-刘佳华《面向对象程序设计(java)》第十三周学习总结
201871010111-刘佳华<面向对象程序设计(java)>第十三周学习总结 实验十一 图形界面事件处理技术 实验时间 2019-11-22 第一部分:理论知识总结 1.事件源:能够产 ...
- 201871010111-刘佳华《面向对象程序设计(java)》课程学习总结
201871010111-刘佳华<面向对象程序设计(java)>课程学习总结 课程学习总结(45分) 经历了一个学期的<面向对象程序设计>课程学习,请每位同学完成以下任务: 点 ...
- 201871010111-刘佳华《面向对象程序设计(java)》第十四周学习总结
201871010111-刘佳华<面向对象程序设计(java)>第十四周学习总结 实验十二 Swing图形界面组件(一) 实验时间 2019-11-29 第一部分:基础知识总结 1.设计 ...
- 201871010111-刘佳华《面向对象程序设计(java)》第十五周学习总结
201871010111-刘佳华<面向对象程序设计(java)>第十五周学习总结 实验十三 Swing图形界面组件(二) 实验时间 2019-12-6 第一部分:理论知识总结 5> ...
- 201871010111-刘佳华《面向对象程序设计(java)》第十二周学习总结
201871010111-刘佳华<面向对象程序设计(java)>第十二周学习总结 实验十 集合与GUI初步 实验时间 2019-11-14 第一部分:基础知识总结 第九章知识总结 1. ...
- 201871010111-刘佳华《面向对象程序设计(java)》第十一周学习总结
201871010111-刘佳华<面向对象程序设计(java)>第十一周学习总结 实验九 泛型程序设计技术 实验时间 2019-11-8 1.实验目的与要求 (1) 理解泛型概念: (2 ...
- 201871010111-刘佳华《面向对象程序设计(java)》第十周学习总结
201871010111-刘佳华<面向对象程序设计(java)>第十周学习总结 实验八 异常.断言与日志 实验时间 2019-11-1 1.实验目的与要求 (1) 掌握java异常处理技术 ...
- 201871010111-刘佳华《面向对象程序设计(java)》第八周学习总结
201871010111-刘佳华<面向对象程序设计(java)>第八周学习总结 实验七 接口的定义与使用 实验时间 2019-10-18 第一部分:知识总结 接口的概念: ①java为了克 ...
随机推荐
- Python基础__字符串拼接、格式化输出与复制
上一节介绍了序列的一些基本操作类型,这一节针对字符串的拼接.格式化输出以及复制的等做做详细介绍.一. 字符串的拼接 a = 'I', b = 'love', c = 'Python'. 我们的目的是: ...
- 利用popstate事件和window下的history对象处理浏览器跳转问题
引子 之前,偶尔在项目中用过history接口做返回上一页功能,当时是用的history.go(-1),前几天面试中遇到一个控制浏览器跳转的问题时有点懵,特意查了文档记录一下,并且列出一些目前能想到的 ...
- as版本切换导致项目损坏,无法启动。环境依赖混乱
以下方法都不管用, 新建一个项目setting的 把main拷过去就行了!!!! Error:(5, 0) Gradle DSL method not found: 'google()'Possibl ...
- java怎么解析带有特殊字符的字符串
可以使用StringEscapeUtils这个工具类.
- [翻译]简单的实现一个Promise
英文原文为:https://www.promisejs.org/implementing/ 1. 状态机 因为 promise 对象是一个状态机,所以我们首先应该定义将要用到的状态. var PEND ...
- react ( 二 )
ref属性 当我们在 react组件中要访问真实的DOM元素时,你可能需要用到ref属性,ref接收一个函数作为属性值,函数接收一个参数,这个参数就是真实的DOM元素.真实的DOM元素渲染到页面上之后 ...
- Myeclipse配置tomcat,以及简单的Myeclipse的配置
第一次总结技术相关的东西,那就坚持下去每天写一点.[有错欢迎指正,本人小白,轻虐] 首先,(以我的为例子吧)需要准备原材料,当然了也需要根据自己的机器底层架构选择了---Myeclipse(2015) ...
- [转]SVN使用log,list,cat,diff查看所有及特定文件版本信息
[转]SVN使用log,list,cat,diff查看所有及特定文件版本信息 http://onefishum.blog.163.com/blog/static/5184730520113153402 ...
- WordPress设置圆形旋转头像的方法
很多网站的评论者的头像都是圆形的,并且当你的鼠标移上去的时候会旋转,那么这个怎么实现呢,我在网上找了很多,但是和我的主题都不适用,现在把我修改后的代码贴出来,只要将下面的代码添加到style.css中 ...
- 一个类似抖音 APP 拍摄按钮效果的控件
TouchButton 一个类似抖音 APP 拍摄按钮效果的控件 效果图预览 用法 <net.angrycode.library.TouchButton android:id="@+i ...