📄 文章编辑10.c
字号:
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include<malloc.h>
/*创建每行的一个存储结构*/
typedef struct line{
char *data; //字符串指针需要时 动态分配内存
struct line *next; //指向下一个字符串的地址
}LINE;
LINE *CreateTXT(LINE *head){
LINE *p;
char tmp[1000];
printf("\n请输入文本,每行最多输入80字符!\n");
printf("输入 Ctrl + E (^E) 则结束输入\n");
p=(LINE *)malloc(sizeof(LINE)); //首先为链表 建立一个附加表头结点
head=p; //将p付给 表头指针
while(1)
{
gets(tmp); //输入字符串!使用C的输入函数
if(tmp[0]==5)break; //如果发现输入 ^E,则退出输入???
p= p->next=(LINE *)malloc(sizeof(LINE));
p->data=(char *)malloc(strlen(tmp)+1); //为结点分配空间
strcpy(p->data,tmp);
if(tmp[strlen(tmp)-1]==5){ //除去最后一个控制符 ^E
p->data[strlen(tmp)-1]='\0';
break;
}
}
p->next=NULL; //是最后的一个指针为空。
head=head->next;
return head;
}
int Count_Space(LINE *head){ //统计空格数
LINE *p=head;
int asc_space=32; //空格的ASCIC 码值
int count=0;
int Len,i;
do
{
Len=strlen(p->data); //计算当前 data 里的数据元素的个数
for(i=0;i<Len;i++)
if(p->data[i]==asc_space)count++; //计算空格数
}
while((p=p->next)!=NULL); //遍历 链表
return count;
}
int Count_Num(LINE * head){ //统计数字个数
LINE *p=head;
int count=0;
int Len,i;
do
{
Len=strlen(p->data); //计算当前 data 里的数据元素的个数
for(i=0;i<Len;i++)
if(p->data[i]>=48 && p->data[i]<=57)count++; //计算数字个数
}
while((p=p->next)!=NULL); //遍历 链表
return count;
}
int Count_All_Word(LINE *head){ //统计文章的总字数
LINE *p=head; //保存链表的首地址
int count=0; //总字母数
do
{
count+=strlen(p->data);
} //计算当前行内的字符数!除'\0'结束符外!注意,该统计包含“空格的长度!”
while((p=p->next)!=NULL); //遍历 链表
return count;
}
int Count_ZM(LINE *head){ // 统计字母数
int count,space_count;
count=Count_All_Word(head); //总的字符数,包含空格
space_count=Count_Space(head); //空格数
return count-space_count; //返回文章的字母总数
}
int Find_Word(LINE *head,char *sch)
{ //统计 sch 在文章中出现的次数
LINE *p=head;
int count=0;
int len1=0; //保存当前行的总字符数
int len2=strlen(sch); //待统计字符串的长度
int i,j,k;
while(p!=NULL) //遍历 链表
{
len1=strlen(p->data);//当前行的字符数
for(i=0;i<len1;i++)
{
if(p->data[i]==sch[0])
{
k=0;
for(j=0;j<=len2-1;j++)
if(p->data[i+j]==sch[j]) k=k+1; //如果字符串首字符相同,依次往后比较
if(k==len2) {count++;i=i+k-1;}//字符串完全相同则计数
}
}
p=p->next;
}return count;
}
void del_string_word(char *s,char *sch)
{ // *s为输入的字符串
int k,kk,len,i,j; // *sch 为将要删除的字符
char *p=strstr(s,sch); //查询结果 函数strstr()用来在一个字符串中查找另一个字符串
char tmp[80];
int count=0; //返回第二个字符串在第一个字符串中第一次出现的位置
len=strlen(s);
i=len-strlen(p);
j=i+strlen(sch);
for(k=0;k<i;k++) tmp[count++]=s[k];
for(kk=j;kk<len;kk++) tmp[count++]=s[kk];
tmp[count]='\0';
strcpy(s,tmp); //返回新的字符串
}
void Del_String(LINE *head,char *sch){ //删除指定的字符串
LINE *p=head;
do
{
if(strstr(p->data,sch)!=NULL)
del_string_word(p->data,sch);
}while((p=p->next)!=NULL); //遍历 链表
}
void OutPutTxt(LINE *head){ //向屏幕输出 文章
LINE *phead;
do
{
printf("%s",p->data);
}while((p=p->next)!=NULL); //遍历 链表
}
void Stats(LINE *head){ //统计
printf("文章统计信息结果如下:\n");
printf("英文字母数:%d\n",Count_ZM(head));
printf("空格数: %d \n",Count_Space(head));
printf("文章中共出现数字:%d\n",Count_Num(head));
printf("统计文章的总字数: %d\n",Count_All_Word(head));
printf("\n");
}
void main(){
char ID;
char ch;
LINE *head; //文章的首结点
printf(" ***********************************************\n");
printf(" * 文章编辑系统 *\n");
printf(" ***********************************************\n");
printf("\n");
printf("主菜单如下:\n");
while(1){
printf(" *************************************************************\n");
printf(" | 1.新建文本链表 2.浏览输入文本 3.文本字数统计 |\n");
printf(" | 4.特定字符串统计 5.字符串的删除 6.返回 |\n");
printf(" *************************************************************\n");
printf("请您按关键字代号选择菜单操作!\n");
scanf("%c",&ID);
getchar();
while(2)
{ if(ID=='1') {
head=CreateTXT(head);
printf("你确定要退出此菜单吗?(Y/N)\n");
scanf("%c",&ch);
getchar();
if(ch=='n') continue;
else if(ch=='y') break;
}
else if(ID=='2') {
OutPutTxt(head);
printf("你确定要退出此菜单吗?(Y/N)\n");
scanf("%c",&ch);
getchar();
if(ch=='n') continue;
else if(ch=='y') break;
}
else if(ID=='3') {
Stats(head);
printf("你确定要退出此菜单吗?(Y/N)\n");
scanf("%c",&ch);
getchar();
if(ch=='n') continue;
else if(ch=='y') break;
}
else if(ID=='4') {
char sch[20];int m;
printf("\n请输入要统计的 字符串\n");
gets(sch);
m=Find_Word(head,sch);
printf("出现的次数为:%d\n",m);
printf("你确定要退出此菜单吗?(Y/N)\n");
scanf("%c",&ch);
getchar();
if(ch=='n') continue;
else if(ch=='y') break;
}
else if(ID=='5') {
char tmp_sch[20];
printf("\n请输入要删除的某一字符串:\n");
gets(tmp_sch);
Del_String(head,tmp_sch);
OutPutTxt(head);
printf("你确定要退出此菜单吗?(Y/N)\n");
scanf("%c",&ch);
getchar();
if(ch=='n') continue;
else if(ch=='y') break;
}
else if(ID=='6') {
printf("你确定要退出系统吗?(Y/N)\n");
scanf("%c",&ch); getchar();
if(ch=='n') break;
else if(ch=='y') exit(0);
}
else {
printf("您输入字母有错,请重新输入!\n\n");
break;
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -