行编辑程序
算法描述
用户在输入数据时,不可能不出错。因此每读入一个字符就保存至数据区是不恰当的。较好的做法是,设立一个用户缓冲区,每次接收用户输入的一行数据,然后逐行存入用户数据区。每一行输入时,提供两个修改方式:输入’#‘表示回退一个,上一个输入的字符无效;输入’@'表示退行符,本行该字符前的所有输入无效。
代码实现
//行编辑程序
void LineEdit()
{
//初始化栈
SqStack S;
InitStack(&S);
//读取字符串
printf("请输入字符串:\n");
char temp, ch;
ch = getchar();
//当没有到全文结束
while(ch!=EOF)
{
//当没有到全文结束且没有到行末位
while(ch!='\n' && ch!=EOF)
{
switch(ch)
{
//输入‘#’回退一个字符
case '#': Pop(&S, &temp); break;
//输入‘@’清空本行内容
case '@': ClearStack(&S); break;
//将字符压栈
default: Push(&S, ch); break;
}
//接受下一个字符
ch = getchar();
}
//遍历栈
printf("行编辑结果:");
StackTraverse(S, visit);
//清空栈,准备下一行的输入
ClearStack(&S);
//如果没有到全文结束,开始读取下一行
if(ch!=EOF) ch = getchar();
}
//销毁栈
DestroyStack(&S);
}
//栈操作的辅助函数定义,用于打印数据
Status visit(SElemType* e)
{
printf("%c", *e);
return OK;
}
int main()
{
LineEdit();
return 0;
}