练习5-11 修改程序entab和detab,使他们接受一组作为参数的制表符停止位。如果启动程序时不带参数,则使用默认的制表符停止位设置
来源:互联网 发布:cf手游m249天羽数据 编辑:程序博客网 时间:2024/06/05 05:33
1.1、制表符停止位间隔一样的entab简单程序
#include <stdio.h>#include <stdlib.h>#define TABINC 8main(int argc,char *argv[]){ int c,nb,nt,pos,tabincrement; nb=nt=0; if(argc<2) tabincrement=TABINC; else //tabincrement=atoi(*++argv); tabincrement=atoi(argv[1]); for(pos=1;(c=getchar())!=EOF;++pos){ if(c==' '){ if(pos%tabincrement!=0){ ++nb; } else{ nb=0; ++nt; } } else{ for( ;nt>0;--nt){ putchar('\t'); } if(c=='\t'){ nb=0; } else{ for( ;nb>0;--nb){ putchar(' '); } } putchar(c); if(c=='\n') pos=0; else if(c=='\t') pos=pos+(tabincrement-(pos-1)%tabincrement)-1; } }}
输入输出(b、c间隔着5个空格):
exam5-11-1 6ab cdefab cdef
不对齐了,测试了下答案也没对齐。制表符停止位每隔6位一个。题意是要像word里制表位一样,设置几个制表符停止位(没设置的仍按默认)。
1.2、错误程序:
#include <stdio.h>#include <stdlib.h>#define MAXLINE 100#define TABINC 8void entab(int ntab,char *tab);main(int argc,char *argv[]){ entab(argc-1,*++argv);}void entab(int ntab,char *tab){ int c,nb,nt,pos,flag; char *r; r=tab; nb=nt=0; flag=(ntab<1)? 0:1; for(pos=1;(c=getchar())!=EOF;++pos){ if(c==' '){ if(flag && pos<MAXLINE ? pos<atoi(tab) : pos%TABINC!=0){ ++nb; printf("tab:%d-nb:%d\n",atoi(tab),nb); } else{ nb=0; ++nt; ++tab; } } else{ for( ;nt>0;--nt){ putchar('\t'); } if(c=='\t'){ nb=0; } else{ for( ;nb>0;--nb){ putchar(' '); } } putchar(c); if(c=='\n'){ pos=0; tab=r; } else if(c=='\t') if(flag) pos=(pos<MAXLINE) ? atoi(tab) : pos+(TABINC-(pos-1)%TABINC)-1; else pos=pos+(TABINC-(pos-1)%TABINC)-1; } }}
输入exam5-11-my 6 15(ab、cf间6个空格):
ab cfabaaaaaacf //示意
输出(cf前相当于17个空格):
abtab:6-nb:1tab:6-nb:2tab:6-nb:3tab:115-nb:1 cfaaaaaaaaaaaaaaaaacf //示意
错误调试(后面调试发现115与15相关,输入25则输出225):
void entab(int ntab,char *tab){ printf("%s \n",tab); printf("%s ",++tab);/* 不能加? */}
entab改成如上,命令行输入exam5-11-my 6 15,第二个printf无输出。
用于比较的测试1(较exam5-3和exam5-10):
#include <stdio.h>void abc(char *ss);main(){ char s[6]; s[0]='a'; s[1]='p'; s[2]='p'; s[3]='l'; s[4]='e'; s[5]='\0'; printf("%s\n",s); /* for(i=0;i<5;++i) *s++=getchar(); */ abc(s); printf("%s",s);}void abc(char *ss){ int i; for(i=0;i<5;++i) *ss++=getchar(); *ss='\0';}
输入abcdef,输出abcde:
appleabcdefabcde
指针到底什么时候能加,什么时候不能加?
测试2:
#include <stdio.h>void printabc(char *nname);main(){ char *name[]={ "January","February" }; printabc(*name);}void printabc(char *nname){ printf("%s\n",nname); printf("%s",++nname);}
输出(nname=*name是指向January首字母指针,++nname并非预想的指向February,而是指向第二个字母):
Januaryanuary
前面错误调试并非无输出,命令行输入exam5-11-my 34
输出:
argc=2argv[0]=exam5-11-myargv[1]=34344
1.3、正确程序,与答案思路不同,直接把制表符停止位传给entab函数,需注意++指针的指向:
#include <stdio.h>#include <stdlib.h>#define MAXLINE 100#define TABINC 8void entab(int ntab,char **tab);main(int argc,char * argv[]){ entab(argc-1,argv);}void entab(int ntab,char **tab){ int c,nb,nt,pos,flag; char **s,*r; /* tab=argv; */ s=tab; r=*++tab; nb=nt=0; flag=(ntab<1)? 0:1; for(pos=1;(c=getchar())!=EOF;++pos){ if(c==' '){ if(flag && pos<MAXLINE && r<=*(s+ntab) ? pos<atoi(r) : pos%TABINC!=0){ ++nb; } else{ nb=0; ++nt; if(flag && r<*(s+ntab)) r=*++tab; } } else{ for( ;nt>0;--nt){ putchar('\t'); } if(c=='\t'){ nb=0; } else{ for( ;nb>0;--nb){ putchar(' '); } } putchar(c); if(c=='\n'){ pos=0; r=*(s+1); } else if(c=='\t') if(flag) pos=(pos<MAXLINE&& r<=*(s+ntab)) ? atoi(r) : pos+(TABINC-(pos-1)%TABINC)-1; else pos=pos+(TABINC-(pos-1)%TABINC)-1; } }}
条件表达式可能还需要根据实际entab实现目标略作修改,以上程序在最大制表符停止位和MAXLINE内,采用参数制表符停止位,在其外采用默认的。答案程序当pos>MAXLINE时,空格都当成制表符,也不恰当。答案settab和tabpos示意:
[NO][NO][NO][NO][YES][NO][NO][NO][YES][NO] YES YES YES YES 停止位 停止位 超出MAXLINE
2.1、detab程序
#include <stdio.h>#include <stdlib.h>#define TABINC 8void detab(int ntab,char **tab);main(int argc,char * argv[]){ detab(argc-1,argv);}void detab(int ntab,char **tab){ int c,pos,nb,flag; char **s,*r; pos=1; s=tab; r=*++tab; flag=(ntab<1)? 0:1; while((c=getchar())!=EOF){ if(c=='\t'){ while(flag && atoi(r)-pos<0) r=*++tab; nb=(flag && r<=*(s+ntab))? atoi(r)-pos+1 : TABINC-(pos-1)%TABINC; while(nb>0){ putchar(' '); ++pos; --nb; } } else if(c=='\n'){ putchar(c); pos=1; r=*(s+1); } else{ putchar(c); ++pos; } }}
while(flag && atoi(r)-pos<0)中flag不能少,否则没有制表符停止位参数时,atoi(r)出错。
0 0
- 练习5-11 修改程序entab和detab,使他们接受一组作为参数的制表符停止位。如果启动程序时不带参数,则使用默认的制表符停止位设置
- 练习5-12 对程序entab和detab的功能做一些扩充,以接受下列缩写的命令:entab -m +n表示制表符从第m列开始,每隔n列停止
- 练习1-20 编写程序detab,将输入中的制表符替换成适当数目的空格,使空格充满到下一个制表符终止位的地方
- 练习 1-20 编写程序 detab,将输入中的制表符替换成适当数目的空格,使空格充满到 下一个制表符终止位的地方。
- 练习1-21 编写程序entab,将空格串替换为最少数量的制表符和空格,但要保持单词之间的间隔不变
- 编写程序detab,将输入中的制表符换成适当数目的空格
- 编些程序detaba,将输入中的制表符替换为适当数目的空格,使空格充满到下一个制表符终止位的地方
- 将输入中的制表符替换成适当数目的空格,使空格充满到下一个制表符终止位的地方
- 将输入中的制表符替换成适当数目的空格,使空格充满到下一个制表符终止位的地方
- 编写启动程序和停止程序的shell脚本
- 相同名称的多进程程序的启动和停止
- 串口参数详解:波特率,数据位,停止位,奇偶校验位
- 设置EditPlus的默认文件格式、编码方式及制表符
- 练习 1- 8 编写一个统计空格,制表符与换行符个数的程序
- 练习1-8 编写一个统计空格、制表符与换行符个数的程序
- 永不停止的程序。。。
- 统计程序中空格,制表符,换行符的个数
- MySQL 安装和启动服务,“本地计算机 上的 MySQL 服务启动后停止。某些服务在未由其他服务或程序使用时将自动停止。”
- shiro,登录处理
- Android开发笔记之notification消息推送 通知栏的实现
- nginx 内置预定义变量
- 机器学习学习笔记 PRML Chapter 2.0 - Prerequisite 2 -Singular Value Decomposition (SVD)
- 图总结
- 练习5-11 修改程序entab和detab,使他们接受一组作为参数的制表符停止位。如果启动程序时不带参数,则使用默认的制表符停止位设置
- BroadcastReceiver-有序广播
- 零基础驯养一头程序猿:从入门到结婚(上)
- 7月6日所学内容
- 学习笔记-Java中的xml文件读取之SAX解析
- 排序算法总结
- 零基础驯养一头程序猿:从入门到结婚(中)
- kettle设计器连接oracle RAC时的连接字符串
- centos7下使用yum安装mysql