关于setjmp longjmp的使用

来源:互联网 发布:生产型进销存软件 编辑:程序博客网 时间:2024/05/15 23:45

#include <stdio.h>#include <setjmp.h>#include <string.h>#define DEBUGjmp_buf jb_env;#define CMD_ADD 1#define CMD_SUB 2#define CMD_MUL 3#define CMD_DIV 4#define GO_TO_START 0#define ERR_DIV_ZERO  (11)#define ERR_CMD (12)double div(double lvar,double rvar);void analysis_expr(char * str_exp);#define LINE_MAX_SIZE 100double lvar;double rvar;char   optr;char str_exp[LINE_MAX_SIZE];intmain(){    int setjmp_result = 0;    switch((setjmp_result = setjmp(jb_env)))    {        case ERR_DIV_ZERO:            printf("Divided by Zero!\n");            break;        case ERR_CMD:            printf("Command error!\n");            break;    }    printf("Enter<example:ADD 1 2>:");    fgets(str_exp,LINE_MAX_SIZE,stdin);    analysis_expr(str_exp);    switch(optr)    {        case CMD_ADD:            printf("%lf + %lf = %lf\n",lvar,rvar,lvar+rvar);            break;        case CMD_SUB:            printf("%lf - %lf = %lf\n",lvar,rvar,lvar-rvar);            break;        case CMD_MUL:            printf("%lf * %lf = %lf\n",lvar,rvar,lvar*rvar);            break;        case CMD_DIV:            printf("%lf / %lf = %lf\n",lvar,rvar,div(lvar,rvar));            break;    }    longjmp(jb_env,GO_TO_START);}void analysis_expr(char * str_exp){    char * ptr = strtok(str_exp," ");        //解析符号;        if(!strcasecmp(ptr,"add"))        optr = CMD_ADD;    else if(!strcasecmp(ptr,"sub"))        optr = CMD_SUB;    else if(!strcasecmp(ptr,"mul"))        optr = CMD_MUL;    else if(!strcasecmp(ptr,"div"))        optr = CMD_DIV;        else{        longjmp(jb_env,ERR_CMD);            }    ptr = strtok(NULL," ");    char * endptr = NULL;    lvar = strtol(ptr,&endptr,10);    if((*endptr)!=0)    {        longjmp(jb_env,ERR_CMD);    }        ptr = strtok(NULL," ");    rvar = strtol(ptr,&endptr,10);    if((*endptr!=0)&&(*endptr!='\n'))    {        printf("endptr:%d.",*endptr);        longjmp(jb_env,ERR_CMD);    }    return ;    }doublediv(double lvar,double rvar){    if(rvar < 0.5 && rvar > -0.5)        longjmp(jb_env,ERR_DIV_ZERO);    return (lvar/rvar);}


原创粉丝点击