论坛交流
首页办公自动化| 网页制作| 平面设计| 动画制作| 数据库开发| 程序设计| 全部视频教程
应用视频: Windows | Word2007 | Excel2007 | PowerPoint2007 | Dreamweaver 8 | Fireworks 8 | Flash 8 | Photoshop cs | CorelDraw 12
编程视频: C语言视频教程 | HTML | Div+Css布局 | Javascript | Access数据库 | Asp | Sql Server数据库Asp.net  | Flash AS
当前位置 > 文字教程 > C语言程序设计教程
Tag:新手,函数,指针,数据类型,对象,Turbo,入门,运算符,数组,结构,二级,,tc,游戏,试题,问答,编译,视频教程

编辑器:字符处理

文章类别:C语言程序设计 | 发表日期:2008-9-24 14:37:34

我用 max 最大计数数组和 net 行计数数组交差调用解决了字符插入存储的问题.

源代码在这,我都加上了注释:

edit.c:

#include<unistd.h>
#include<stdio.h>
#include<curses.h>

/* 设置坐标初始值 */
#define STARTX 1
#define STARTY 1

/* curses 初始函数 */
void initial()
{
initscr();
cbreak();
nonl();
noecho();
intrflush(stdscr,FALSE);
keypad(stdscr,TRUE);
refresh();
}

/* 存储编辑内容全文的 name 数组结构 */
struct {
char name[200000];
} edit;

/* 主函数 */
int main(int argc,char *argv[])
{
int x=STARTX;
int y=STARTY;
int max[2000],ch,i,a,net[2000],sizefile=0;
char line[100];
FILE *fp;
/* 以上设置了最大计数数组 max,行计数数组 net,数组长度暂存变量 sizefile,回车行记录数组 line 等 */

/* 判定启动程序时输入的参数 */
if(argc==1 || argc>2) {
printf("please input:./edit file\\nexit:Esc\\n");
}
if(argc==2) {
/* 打开要存储的文件 */
fp=fopen(argv[1],"w");
initial();

//box(stdscr,ACS_VLINE,ACS_HLINE);
move(0,30);
printw("edit- %s",argv[1]);
refresh();

move(x,y);
do{
ch=getch();
switch(ch){
/* 上键控制 */
case KEY_UP:
if(y>1) --y;
move(y,x);
break;

/* 下键控制 */
case KEY_DOWN:
++y;
break;

/* 右键控制 */
case KEY_RIGHT:
++x;
break;

/* 左键控制 */
case KEY_LEFT:
if(x>1) --x;
break;

/* 回车控制 */
case '\\r':
if (y==1) {
for (a=0,i=(x-1);i<=net[1];i++,a++) {
line[a]=edit.name[i];
}
line[a+1]='\\0';
} else {
for (i=1;i<y;i++) {
sizefile=net[i]+sizefile;
}
for (a=0,i=x;i<=net[y];i++,a++) {
line[a]=edit.name[sizefile+i];
}
line[a+1]='\\0';
}
sizefile=0;
/* 以上的控制是按回车键时,把光标到这行结束的所有字符拷贝进 line 数组里 */

if (x<=net[y]) {
for (i=net[y];i>=x;i--) {
delch();
}
}
/* 以上是把光标到行尾所有 curses 所显示的字符清除 */

if (y==1) {
for (i=strlen(edit.name);i>=(x-1);i--) {
edit.name[i+1]=edit.name[i];
}
edit.name[strlen(edit.name)+2]='\\0';
edit.name[x-1]='\\n';
net[1]=x-1;
} else {
for (i=1;i<y;i++) {
sizefile=net[i]+sizefile;
}
for (i=strlen(edit.name);i>=(sizefile+x);i--) {
edit.name[i+1]=edit.name[i];
}
edit.name[strlen(edit.name)+2]='\\0';
edit.name[sizefile+x]='\\n';
net[y]=x;
sizefile=0;
}
/* 以上是对 edit.name 数组进行处理,先将与光标对应位的字符及后面的字符后移一位,然后加 '\\n' 符进光标对应位 */

++y;
x=1;
move(y,x);
insertln();
printw("%s",line);
for(i=2000;i>=y;i--) {
net[i]=net[i-1];
}
net[y]=strlen(line);
/* 以上是重置行记数数组的所有记录,使其能够正确反映对应的行的字符数确*/

/* 对 line 进行置空处理 */
memset(line,'\\0',sizeof(line));
break;

/* 制表键 'tab' 的控制 */
case '\\t':
x+=4;
break;

/* 向前删除的控制 */
case KEY_BACKSPACE:
if (y==1) {
for (i=(x-2);i<strlen(edit.name);i++) {
edit.name[i]=edit.name[i+1];
}
edit.name[strlen(edit.name)]='\\0';
net[1]=net[1]-1;
} else {
for (i=1;i<y;i++) {
sizefile=net[i]+sizefile;
}
for(i=(sizefile+x-1);i<strlen(edit.name);i++) {
edit.name[i]=edit.name[i+1];
}
edit.name[strlen(edit.name)]='\\0';
net[y]=net[y]-1;
sizefile=0;
}
/* 以上是对数组 name 的删除控制 */

if(x>1) --x;
move(y,x);
if (x>1) {
delch();
} else {
addch(' ');
}
break;

/* 向后删除控制 */
case KEY_DC:
if (y==1) {
for (i=(x-1);i<=strlen(edit.name);i++) {
edit.name[i]=edit.name[i+1];
}
edit.name[strlen(edit.name)]='\\0';
net[1]=net[1]-1;
} else {
for (i=1;i<y;i++) {
sizefile=net[i]+sizefile;
}
for(i=(sizefile+x);i<strlen(edit.name);i++) {
edit.name[i]=edit.name[i+1];
}
edit.name[strlen(edit.name)]='\\0';
net[y]=net[y]-1;
sizefile=0;
}
/* 以上是对数组 name 的删除控制 */

delch();
break;

/* ESC 退出存储文本的控制 */
case 27:

/* 将数组 edit.name 记载的全文内容存入文件中 */
fwrite(&edit.name,sizeof(edit.name),1,fp);
endwin();

/* 显示数组 name 记录的内容,作为测试用 */
printf("name:%s\\n",edit.name);
exit(0);

/* 键入的字符内容显示存储的控制 */
default:
insch(ch);
if (y==1) {

/* 开始字符插入控制 */
if(x<=net[1]) {
/* 判定是否第一行进行字符插入编写 */
for (i=strlen(edit.name);i>=(x-1);i--) {
edit.name[i+1]=edit.name[i];
}
edit.name[strlen(edit.name)+1]='\\0';
edit.name[x-1]=ch;
/* 是的情况下,name 数组内容后移一位,然后写入 */
max[1]=net[1]+1;
} else {
/* 字符按顺序编写的控制 */
edit.name[x-1]=ch;
}
} else {
for(i=1;i<y;i++) {
sizefile=net[i]+sizefile;
}
if (x<=net[y]) {
/* 判定是否其它行进行字符插入编写 */
for (i=strlen(edit.name);i>=(sizefile+x);i--) {
edit.name[i +1]=edit.name[i];
}
edit.name[strlen(edit.name)+1]='\\0';
edit.name[sizefile+x]=ch;
/* 是的情况下,name 数组内容后移一位,然后写入 */

max[y]=net[y]+1;
} else {

/* 字符按顺序编写的控制 */
edit.name[sizefile+x]=ch;
}
sizefile=0;
}
/* 以上是对字符编写插入的控制 */

/* 用行计数数组记载每行的字符数 */
if (max[y]<=x) {
max[y]=x;
}
net[y]=max[y];
x++;
break;
}
move(y,x);
}while(1);
}
}

整个程序的数组移位用的次数太多,很轻易造成混淆,也非常轻易出错,出错后错误很隐蔽不轻易查找.因此在开始编写的时候必须非常清醒地知道各个数组之间的关联,和移位后其它数组是否会受到影响,在这上面只要有一点模糊就轻易导致各种的错误
视频教程列表
文章教程搜索
 
C语言程序设计推荐教程
C语言程序设计热门教程
看全部视频教程
购买方式/价格
购买视频教程: 咨询客服
tel:15972130058