关于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程序设计的补充实现的更多相关文章

  1. 20155303狄惟佳预备作业三Linux学习笔记

    20155303狄惟佳预备作业三Linux学习笔记 初次接触Ubuntu系统以及Linux内核,了解了其产生的历史,从感性来讲,深深吸引我的是其中蕴含的珍贵的开源精神,以及Stallman等人对&qu ...

  2. 201871010111-刘佳华《面向对象程序设计(java)》第十三周学习总结

    201871010111-刘佳华<面向对象程序设计(java)>第十三周学习总结 实验十一 图形界面事件处理技术 实验时间 2019-11-22 第一部分:理论知识总结 1.事件源:能够产 ...

  3. 201871010111-刘佳华《面向对象程序设计(java)》课程学习总结

    201871010111-刘佳华<面向对象程序设计(java)>课程学习总结 课程学习总结(45分) 经历了一个学期的<面向对象程序设计>课程学习,请每位同学完成以下任务: 点 ...

  4. 201871010111-刘佳华《面向对象程序设计(java)》第十四周学习总结

    201871010111-刘佳华<面向对象程序设计(java)>第十四周学习总结 实验十二  Swing图形界面组件(一) 实验时间 2019-11-29 第一部分:基础知识总结 1.设计 ...

  5. 201871010111-刘佳华《面向对象程序设计(java)》第十五周学习总结

    201871010111-刘佳华<面向对象程序设计(java)>第十五周学习总结 实验十三  Swing图形界面组件(二) 实验时间 2019-12-6 第一部分:理论知识总结 5> ...

  6. 201871010111-刘佳华《面向对象程序设计(java)》第十二周学习总结

    201871010111-刘佳华<面向对象程序设计(java)>第十二周学习总结 实验十   集合与GUI初步 实验时间 2019-11-14 第一部分:基础知识总结 第九章知识总结 1. ...

  7. 201871010111-刘佳华《面向对象程序设计(java)》第十一周学习总结

    201871010111-刘佳华<面向对象程序设计(java)>第十一周学习总结 实验九  泛型程序设计技术 实验时间 2019-11-8 1.实验目的与要求 (1) 理解泛型概念: (2 ...

  8. 201871010111-刘佳华《面向对象程序设计(java)》第十周学习总结

    201871010111-刘佳华<面向对象程序设计(java)>第十周学习总结 实验八 异常.断言与日志 实验时间 2019-11-1 1.实验目的与要求 (1) 掌握java异常处理技术 ...

  9. 201871010111-刘佳华《面向对象程序设计(java)》第八周学习总结

    201871010111-刘佳华<面向对象程序设计(java)>第八周学习总结 实验七 接口的定义与使用 实验时间 2019-10-18 第一部分:知识总结 接口的概念: ①java为了克 ...

随机推荐

  1. 原生JS实现tab切换--web前端开发

    tab切换非常常见,应用非常广泛,比较实用,一般来说是一个网站必不可少的一个效果.例如:https://123.sogou.com/中的一个tab部分: 1.案例源代码 <!DOCTYPE ht ...

  2. Poj3683:Priest John's Busiest Day

    题意 n对夫妻要结婚,第i对夫妻结婚的婚礼持续时间为[Si, Ti],他们会举行一个仪式,仪式时间为Di,这个仪式只能举行在开头或者结尾举行,要么[Si, Si+Di],要么[Ti-Di, Ti],然 ...

  3. ubuntu16.04 安装常见问题解决方案------输入法黑框

    我的系统是 lubuntu 16.04 刚安装输入法候选字的地方全是黑框,然后百度查到了 compton 和 xcompmgr 这两个说是窗口微调 透明 ,这两个方法对我的系统不管用 .各位如果遇到黑 ...

  4. 杭电oj-1002-A+B Problem

    Problem Description I have a very simple problem for you. Given two integers A and B, your job is to ...

  5. 让wordpress标签云显示文章数的正确方法

    先看一下效果 在百度经验找到一个教程,可惜,根据实践发现方法是错误的, 百度经验上的代码: 1 2 3 4 5 6 7 8 9 10 11 12 //标签tag所包含的文章数量 function Ta ...

  6. 记一次 synchronized 锁字符串引发的坑兼再谈 Java 字符串

    业务有一个需求,我把问题描述一下: 通过代理IP访问国外某网站N,每个IP对应一个固定的网站N的COOKIE,COOKIE有失效时间. 并发下,取IP是有一定策略的,取到IP之后拿IP对应的COOKI ...

  7. java函数回调

    Class A实现接口CallBack callback--背景1 class A中包含一个class B的引用b --背景2 class B有一个参数为callback的方法f(CallBack c ...

  8. 使用nodegrass简单封装http请求例子

    1.项目中经常性的使用http发送请求处理数据.而大部分请求方式为get和post,于是对http请求进行封装,提供代码的利用率. 2.nodegress是nodejs的一个请求工具. 具体步骤及代码 ...

  9. [模拟赛] T3 Exploit

    Description 4X概念体系,是指在PC战略游戏中一种相当普及和成熟的系统概念,得名自4个同样以"EX"为开头的英语单词. eXplore(探索) eXpand(拓张与发展 ...

  10. 笔记:Spring Cloud Feign 声明式服务调用

    在实际开发中,对于服务依赖的调用可能不止一处,往往一个接口会被多处调用,所以我们通常会针对各个微服务自行封装一些客户端类来包装这些依赖服务的调用,Spring Cloud Feign 在此基础上做了进 ...