将文本看作一个大的字符串,文本处理也就是对字符串的处理。文本处理的实质就是修改字符数据的形式和格式,虽然各个文本编辑程序功能不同,但基本操作就是串的查找,插入,修改等。
这里采用堆串结构,将整个文本看作一个字符串存放在堆区对其进行处理,不灵活,只能实现一些基本操作。
实现如下:
在堆串的基础操作上,只需要利用堆串的函数,实现以下操作,就可以
字符统计
enum MyEnum
{
shu=0,symbol,letter,words,sentence,all // 数字,符号,字母,单词,句子
};
// 05-各类字符数目统计
void Tongji(string* L) {
int Num[6] = { 0 }; // 设置数组存放各类字符的数目
int now = 0;
for (int i = 0; i < L->len; ++i) { // 遍历整个字符串
if (L->S[i] >= '0' && L->S[i] <= '9') { // 如果字符串是数字,数字++
++Num[shu];
}
else if ((L->S[i] >= 'A'&&L->S[i]<='Z')||(L->S[i] >= 'a' && L->S[i] <= 'z')) { // 如果字符串是字母,字母++
++Num[letter]; // zimu ++
if (!((L->S[i+1] >= 'A' && L->S[i+1] <= 'Z') || (L->S[i+1] >= 'a' && L->S[i+1] <= 'z')) ){ // 如果字母后有符号,就划分为单词
++Num[words]; // danci ++
}
} // 有 遇到句号,问好,感叹号这些表示句子结束的标点,句子数目++
else if(L->S[i]=='.'||L->S[i]=='?'||L->S[i]=='!') { // juzi ++
++Num[sentence];
++Num[symbol]; // fuhao ++
}
else if (L->S[i] != ' '){ // 是个符号就增加符号数目
++Num[symbol]; // fuhao ++
}
if (L->S[i] != ' ') { // 是个空格就增加空格数目
++Num[all]; // zifu ++
}
}
printf("统计结果如下:\n");
printf("有%d个单词,%d个句子,%d个字母,%d个数字,%d个符号,总计字数为%d", Num[words], Num[sentence], Num[letter], Num[shu], Num[symbol], Num[all]);
}
#include "HString.h" // 引入前面实现的堆串
void Menu() {
printf("*******文本处理系统*****\n");
printf("*******1.文本输入******\n");
printf("*******2.文本删除******\n");
printf("*******3.文本输出******\n");
printf("*******4.文本统计******\n");
printf("*******5.文本保存******\n");
printf("*******6.程序退出******\n");
}
// 06-文本输入
/*为了能够一直输入,这里将‘#’作为输入结束标志,并且利用string中的Push()函数进行字符的输入*/
void Text_Push(string* L) {
printf("请输入文本,输入'#'后结束输入\n");
char c = getchar();
while (c != '#') {
Push_String(L, c);
c = getchar();
}
}
// 07-文本存储
void Text_Save(string* L) {
FILE* fp; // 设置文件类型指针
char FileName[20];
scanf("%s", FileName); // 确认文件名称
// 文本,追加方式打开
if ((fp = fopen(FileName, "at")) == NULL) { // 用文本追加的方式打开目标文件,失败退出程序
printf("cannot open file ");
exit(1);
}
else {
fputs(L->S, fp); // 成功的话就按行存储方式将文本存入指定文件的后续
}
fclose(fp); // 随手关闭好习惯
}
// 08-操作选择
void Chose(int key, string* L) {
switch (key) {
case 1:Text_Push(L);
break;
case 2:Erase_string_B(L);
break;
case 3:Out_String(L);
break;
case 4:Tongji(L);
break;
case 5:Text_Save(L);
break;
case 6:exit(0);
break;
}
}
// 文本处理
void Text_Process() {
string* L = init_String();
int key = 1;
while (1) {
Menu();
scanf("%d", &key);
Chose(key, L);
system("pause");
system("cls");
}
}