--------------------2019/1/2声明一下:这个已经过去一年了 我不记得了。。。我 有生之年 有空会重新写的。就是这样。姐姐忙着新课设呢。。。。
10天课程设计写了这个垃圾代码, 有需要同学可以看看。
2018.12.19 上设计模式听到命令模式:更新一下:撤销真的是 用栈啊,现在可以结束理解了,大概有空会修改下
我采用了链表和顺序表,然后算法就是字符串匹配BF,还有顺序表查找,删除,但是均有修改,比如BF算法修改成可以记录重复出现位置还可以返回位置,顺序表查找删除是可以以字符串为单位进行插入删除,,,呃呃呃,我只是在前人基础上小小修改了一下。本来还想写撤销功能,因为时间还有各种因素就暂时搁置,我总是会写完,这个有bug,体现在插入,对于汉字还有尾部插入,我没有处理好。。。修改修改就可以了。因为时间原因就不想写了,还有这次收获也会说出来、
#include
#include
#include
#include
#include
# define LEN sizeof(struct Lnode)
typedef struct list
{
char data[80];//80字符为1行,1行一个节点
int line[80];//列
int row;//行
struct Lnode *next;
} list,*linklist;
typedef struct stack
{
int data;
struct stack* next;
} stack,*linkstack;
linkstack push(linkstack s,int data1);
linkstack pop(linkstack s,int data1);
int search(char *s,char *t,int x[10]);
void replace(char *s,char *t,char *t1);//在字符串s里找到字符串t,然后用t0替换t;
int judege(char *s);
void BF(char *s,char *t);
void delete(linklist L,char* ch);
void insert1(linklist L,int row,int line,char *ch);
void insert(int x,char *s,char *t);
void insert0(int x,char *s,char *t);//在字符串s的x位置插入t
void print(linklist L)//80字符为1行,1行一个节点
{
int len,i=0;
while(L)
{
printf("第%d行:",L->row);
while(i
{
printf("%c",L->data[i]);
i++;
}
printf("\n");
L=L->next;
i=0;
}
}
linklist create()
{
int i=0,j,line,t;
char express[80]="\0";
linklist head,r,p;
head=(linklist)malloc(sizeof(list));
head->next=NULL;
printf("(输入quit退出)\n");
// memset(head->data,'\0',80);//没有什么用
//strcpy(head->data,"\0");
fflush(stdin);
head->row=i;
printf("第%d行:",head->row);
gets(express);
strcpy(head->data,express);
//t=judege(express);
for(line=0; line
head->line[line]=line;
}
r=head;
while(1)
{
i++;
p=(linklist)malloc(sizeof(list));//为新节点开辟空间
//strcpy(p->data,"\0" );
//memset(p->data,'\0',80);
printf("第%d行:",i);
gets(express);
for(line=0; line
p->line[line]=line;
}
strcpy(p->data,express);
p->row=i;
if(strcmp(express,"quit")==0) break;
p->next=NULL;
r->next=p;
r=p;
}
return head;
}
/*int judege(char *s)
{
int len=0,i=0,len1=0;
while(i
if(s[i]>127)
{
len++;
}
else
{
len1++;
}
i++;
}
return len/2+len1;
}*/
void count(linklist L)
{
int Chinese=0;
int lowcase=0;
int capital=0;
int punction=0;
int space=0;
int i=0,num=0;
while(L)
{
while(i
{
if(isdigit(L->data[i]))//isdigit
{
num++;
}
else if(isupper(L->data[i]))
{
capital++;
}
else if(islower(L->data[i]))
{
lowcase++;
}
else if(ispunct(L->data[i]))
{
punction++;
}
else if(L->data[i]==32)
{
space++;
}
else if((uint8_t)L->data[i]>127)//
{
Chinese++;
}
i++;
}
L=L->next;
i=0;
}
printf("汉字个数为: %d\n",Chinese/2);
printf("数字个数为: %d\n",num);
printf("空格个数为: %d\n",space);
printf("标点符号个数为: %d\n",punction);
printf("小写字母个数为: %d\n",lowcase);
printf("大写字母个数为: %d\n",capital);
}
int main()
{
int n1[10];
int c,c1,end,line1,row1,m=0,m1=0,n=0;
char ch[80],ch1[80],x[80],x1[80],x2[80];
linklist L,L1,position,L2,L3,L4,L5;
L1=NULL;
printf(" \t\t ----------->\n");
printf("\t\t \t |文本编辑器| \t\n");
printf(" \t\t <-----------\n");
printf(" \t \t \t 1.开始 \t\n");
printf(" \t \t \t 2.退出 \t\n");
printf("请选择功能:\n");
while( scanf("%d",&c)==1)
{
printf("\t\t|**************功能菜单**************|\n");
printf("\t\t \t 0.退出\n");
printf("\t\t \t 1.写文本\n");
printf("\t\t \t 2.文本内容统计\n");
printf("\t\t \t 3.文本内容查找\n");
printf("\t\t \t 4.文本内容删除\n");
printf("\t\t \t 5.文本内容插入\n");
//printf("\t\t \t 6.撤销内容\n");
printf("\t\t \t 6.替换内容\n");
printf("\t\t|*************************************|\n");
printf("请选择:\n");
while(scanf("%d",&c1)!=0)
{
switch(c1)
{
case 0:
return 0;
break;
case 1:
printf("请输入文档");
L1= create();
printf("输出:\n");
print(L1);
break;
case 2:
count(L1);
break;
case 3:
printf("请输入想查找的字符或者字符串:");
scanf("%s",ch);
L2=L1;
int count=0;
while(L2)
{
n=search(L2->data,ch,n1);
if(n>0)
{
int i;
for(i=0; i
printf("出现在%d行,在%d列\n",L2->row,n1[i]);
}
}
count=count+n;
L2=L2->next;
}
if(count==0) printf("查无此信息\n");
else
{
printf("共出现%d次",count);
}
break;
case 4:
printf("请输入想删除的字符或者字符串:");
scanf("%s",ch1);
print(L1);
delete(L1,ch1);
break;
case 5:
printf("请输入想插入的字符或者字符串:");
scanf("%s",x);
printf("请输入想插入的行数和列数: ");
scanf("%d %d",&row1,&line1);
m=0;
L3=L1;
while(L3)
{
while(m<=strlen(L3->data))
{
if((L3->line[m]==line1)&&(L3->row==row1))
{
insert(L3->line[m],L3->data,x);
break;
}
m++;
}
L3=L3->next;
m=0;
}
break;
//case 6:
// printf("确定撤销?\n");//撤销:上一步
// break;
case 6:
printf("请输入查找的内容\n");//删除插入
scanf("%s",x1);
L4=L1;
L5=L1;
int n0=0;
int count1=0;
while(L4)
{
n0=search(L4->data,x1,n1);
count1=count1+n0;
L4=L4->next;
}
if(count==0) printf("查无此信息\n");
else
{
printf("共出现%d次",count1);
printf("请输入替换内容\n");
scanf("%s",x2);
while(L5)
{
replace(L5->data,x1,x2);
L5=L5->next;
}
printf("替换后:\n");
print(L1);
}
break;
}
}
}
}
void BF(char *s,char *t)
{
int i=0,j=0,t1,t2;
int slen=strlen(s);
int tlen=strlen(t);
while(i
if(s[i]==t[j])
{
i++;
j++;
if(j==tlen)
{
for(t1=0; t1
for(t2=(i-tlen)+1; t2<=slen-1; t2++)
{
s[t2-1]=s[t2];
}
}
s[slen-tlen]='\0';
slen=strlen(s);
i=0;
j=0;
}
}
else
{
i=i-j+1;
j=0;
}
}
}
void replace(char *s,char *t,char *t1)//在s位置用t1来替换t
{
int i,j=0,m=0,n=0;
int x[10];
j=search(s,t,x);
BF(s,t);
m=strlen(t);
n=strlen(t1);
for(i=0; i
if(i==0)
{
insert0(x[i],s,t1);
}
else
{
insert0(x[i]+n-m,s,t1);
}
}
}
void insert(int x,char *s,char *t)//在字符串s的x位置插入t
{
int i,j,m;
i=strlen(s);
printf("插入前:%s\n",s);
for(m=0; m
for(j=i; j>=x-1; j--)
s[j+1]=s[j];
s[x++]=t[m];
++i;
}
printf("插入后:%s",s);
}
void insert0(int x,char *s,char *t)//在字符串s的x位置插入t
{
int i,j,m;
i=strlen(s);
// printf("插入前:%s\n",s);
for(m=0; m
for(j=i; j>=x-1; j--)
s[j+1]=s[j];
s[x++]=t[m];
++i;
}
// printf("插入后:%s",s);
}
void delete(linklist L,char* ch)
{
int m1=0;
int m2=2;
int m3=3;
while(L)
{
BF(L->data,ch);
printf("第%d行:%s\n",L->row,L->data);
L=L->next;
}
}
int search(char *s,char *t,int x[10])//BF算法。
{
int i=0,j=0,t1,t2,num=0;
//int *t0;
// int temp;
// int a[10];
int slen=strlen(s);
int tlen=strlen(t);
while(i
if(s[i]==t[j])
{
i++;
j++;
if(j==tlen)
{
printf("%s在%s 的%d位置\n",t,s,i-tlen);
x[num]=i-tlen;
num++;
}
}
else
{
i=i-j+1;
j=0;
}
}
return num;
}
linkstack push(linkstack s,int data1)
{
linkstack p;
p=(linkstack)malloc(sizeof(stack));
p->data=data1;
p->next=s;
s=p;
return s;
}
linkstack pop(linkstack s,int data1)
{
linkstack p;
if(s==NULL) return NULL;
data1=s->data;
p=s;
s=s->next;
free(p);
return s;
}
int gettop(linkstack s,int data1)
{
if(s!=NULL)
return s->data;
}
//void cancel()//进栈出栈,,,,,,,哇、
Get:
1.
如果gets()没有起作用
解决:
这个函数之前还有用scanf()函数读取变量的操作,如果是,那么就是由于这个scanf()在缓冲区中遗留了一个输入数据时按的"回车键",这个gets()会将这个字符取走,不会再等待从键盘输入.
解决方法:
可以在这个gets()函数的前一行加入一句fflush(stdin);刷新输入缓冲区.
2.
sizeof(指针)=4
sizeof和strlen的区别
❀第一个例子:
char* ss = "0123456789";
1、sizeof(ss)的结果是4,ss是指向字符串常量的字符指针
2、sizeof(*ss)的结果是1,*ss是第一个字符
❀第二个例子:
char ss[] = "01233456789";
1、sizeof(ss)结果是11,ss是数组,计算到'\0'的位置,因此是10+1
2、sizeof(*ss)结果是1,*ss是第一个字符
❀第三个例子
char ss[100] = "0123456789";
1、sizeof(ss)的结果是100,ss表示在内存中预分配的大小:100*1
2、strlen(ss)的结果是10,它的内部实现是用一个循环计算字符串的长度,直到'\0'为止。
❀第四个例子
int ss[100] = "0123456789";
1、sizeof(ss)的结果是400,ss表示在内存中的大小,为100*4
2、strlen(ss)错误,strlen的参数只能是char*,且必须是以'\0'结尾的。
注:笔者试验时无法对ss初始化
3.
字节和位是不同。。。。一个字节=8位。 int long 4字节,32位,(不同机器不一样,)
5.指针作为函数参数,,,,,返回多值
6 撤销操作与栈
撤销就是返回到上一步,栈内元素取出来,然后栈顶元素就是上一个,但是要判断栈顶元素为空不?
7memset 对于字符串初始化比较有用,对于整型数组,赋值只能为0 -1,还要看大小,没有什么用的东西、