在c/c++里string怎么从后向前删除字符

 我来答
匿名用户
2013-07-14
展开全部
给,已经都改好了:
#include
#include
#include
#include
#include

#define STACK_INIT_SIZE 16
#define OK 1
#define TRUE 1
#define FALSE 0
#define ERROR 0
char PASSWORD[16]="12345678"; /*密码,全局变量*/
typedef char SElemType;
typedef struct STACK /*定义栈类型*/
{
SElemType *base; //定义栈底指针
SElemType *top; //定义栈顶指针
int stacksize; //定义栈的Size
int length; //定义栈长,也就是栈中的成员个数
}SqStack,*Stack;
typedef int Status;
void InitStack(Stack *S) /*初始化栈*/
{
*S=(SqStack *)malloc(sizeof(SqStack)); //申请栈空间
(*S)->base=(SElemType *)malloc(STACK_INIT_SIZE*sizeof(SElemType)); //申请栈底成员空间,也就是栈的第一个压栈成员
if(!(*S)->base)exit(-1); //容错处理,malloc失败,则退出
(*S)->top=(*S)->base; //先将栈顶指针指向栈底(当前没有成员压栈)
(*S)->stacksize=STACK_INIT_SIZE;
(*S)->length=0;
}
Status DestroyStack(Stack *S) /* 销毁栈*/
{
free((*S)->base); //释放栈底空间
free((*S)); //释放栈空间
return OK;
}
void ClearStack(Stack *S) /*把栈置为空*/
{
(*S)->top=(*S)->base; //将栈顶指针指向栈底
(*S)->length=0; //将栈长置为0
}
Status StackEmpty(SqStack S) /*判断栈空否*/
{
if(S.top==S.base) return TRUE; //如果栈顶指针指向栈底的话,索命当前栈中没有元素,所以栈为空
else
return FALSE;
}
void Push(Stack *S,SElemType e) /*把数据压入栈*/
{
if((*S)->top - (*S)->base>=(*S)->stacksize) //如果栈的长度超过默认值了,则realloc
{
(*S)->base=(SElemType *) realloc((*S)->base,
((*S)->stacksize + 2) * sizeof(SElemType));
if(!(*S)->base)exit(-1);
(*S)->top=(*S)->base+(*S)->stacksize;
(*S)->stacksize += 2;
}
*((*S)->top++)=e; //将栈顶指针移到新的压栈成员之上
++(*S)->length; //将栈长加1
}
Status Pop(Stack *S) /*删除栈顶元素*/
{
if((*S)->top==(*S)->base) return ERROR; //如果当前栈已经为空,则返回错误
(*S)->top--; //栈顶指针下移一位
--(*S)->length; //将栈长减1
return OK;
}
Status GetTop(Stack S,SElemType *e)/*返回栈顶元素*/
{
if(S->top==S->base) return ERROR; 如果当前栈已经为空,则返回错误
*e=*(S->top-1); //取得栈顶指针下的第一个成员(也就是栈顶成员)
S->top--; //将栈顶指针下移一位
}
void Change(SqStack S,char *a) /*将栈中的元素按反序付给 a */
{ int n=S.length-1 ; //取得元素个数
while (!StackEmpty(S)) //只要栈未置空,则继续循环
GetTop(&S,&a[n--]); //将栈顶元素从后向前的赋值给数组a的成员
}
void gotoxy(int a,int b){ //定义光标操作函数
int x=0x0b;
HANDLE hInput, hOutput;
COORD loc;
loc.X = a; loc.Y=b; //定义光标的x,y坐标
hOutput = GetStdHandle(STD_OUTPUT_HANDLE);// 获得输出的屏幕缓冲区的句柄
SetConsoleCursorPosition(hOutput, loc); //设定光标坐标
}
void Control(Stack *s)
{int i=0,k,j=0; <br/>SElemType ch,*a=NULL; <br/>k=strlen(PASSWORD); //取得正确密码的长度<br/>printf("输入一个 %d 个数的密码,你只有 %d 次机会:\n",k,3-i); <br/>printf("C:\\>"); <br/>gotoxy(5,2); //定义光标位置<br/>for(;;) <br/>{ if(i>=3) //如果用户输入达到了3次,跳出for循环<br/>{ i++; <br/>system("cls"); //清屏处理<br/>gotoxy(1,1); /*定位光标位置*/ <br/>break; <br/>}
else if(i>0&&i<3) //如果用户输入没有达到3次,继续进行密码输入
{
system("cls"); //清屏处理
printf("输入一个 %d 个数的密码,你只有 %d 次机会:\n",k,3-i);
printf("C:\\>");
gotoxy(5,2); //定义光标位置
for(j=1;j<=(*s)->length;j++)printf(" ");
gotoxy(5,2);//定义光标位置
ClearStack(s);//把栈置为空,准备下一次输入
}
for(;;) /* 密码输入,可退格 */
{ch=getch(); /* 退格 的ASCII 是8 */ <br/>if(ch!=13) /* 判断是否为回车,不是则把它付给下面*/ <br/>{if(ch==8) //如果输入的是退格(ACSII码值为8)<br/>{Pop(s);gotoxy(4+j,2);printf(" ");gotoxy(4+j,2);} //进行输入退格时的处理,将先前压栈的元素退栈
else {printf("*");Push(s,ch);} //如果输入是有效字符,则压栈,并在屏幕上显示*
j=(*s)->length;} //记录当前栈长
else break; //如果输入的是回车,则退出for循环,认为本次密码输入完毕
}
i++; //输入密码的次数计数加1
if(k!=j) continue; //如果密码位数不对,不需要判断,直接进行下一次输入
else //输入密码的正确性判断
{ a=(SElemType *)malloc((*s)->length*sizeof(SElemType));
Change(**s,a); //将栈内的元素依次退栈,并从后向前的写入数组a的成员中
for(j=1;j<=(*s)->length;) //判断密码的每一位是否正确
{if(a[j-1]==PASSWORD[j-1]) j++; //相等的判断下一位<br/>else {j=(*s)->length+2;break;}} //不等的话,退出
if(j==(*s)->length+2) continue;
else break;}}/*最上面的for完*/
if(i==4) printf("\n密码错误,即将退出"); //如果输入次数超过上限了,报错
else printf("\n密码正确\n"); //密码正确
if(a!=NULL) free(a); //释放数组a的空间
}
main()
{Stack s; <br/>system("cls");/*清屏*/ <br/>InitStack(&s); /*初始化栈*/<br/>Control(&s); /*密码输入和判断*/<br/>getch(); <br/>DestroyStack(&s); /*销毁栈*/<br/>}

在VC上验证通过。
大体说明:
1. clrscr();这个是TC用的,VC上可以用system("cls");(相关头文件#include)
2. gotoxy是TC的,VC上没有相关的,所以我自己写了一个gotoxy(相关头文件#include )
3. 原来的代码里的显示是有问题的,我给统一调整了,3次输入位置一致了
4. 原来的直接free(a)是错的,我给改好了:if(a!=NULL) free(a);

OK了
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式