练习4-10 另一种方法是通过getline函数读入整个输入行,这种情况下可以不使用getch和ungetch函数

来源:互联网 发布:不干胶打印机软件 编辑:程序博客网 时间:2024/06/05 23:49
#include <stdio.h>#include <stdlib.h>#define MAXOP 100#define NUMBER '0'#define MAXLINE 100int getop(char [],char []);void push(double);double pop(void);int getline(char s[],int lim);main(){    int type;    double op2;    char s[MAXOP];    char line[MAXLINE];    getline(line,MAXLINE);    while((type=getop(line,s))!=EOF){        printf("s:%s",s);        switch(type){        case NUMBER:            push(atof(s));            break;        case '+':            push(pop()+pop());            break;        case '*':            push(pop()*pop());            break;        case '-':            op2=pop();            push(pop()-op2);            break;        case '/':            op2=pop();            if(op2!=0.0)                push(pop()/op2);            else                printf("error: zero divisor\n");            break;        case '\n':            printf("\t%.8g\n",pop());            break;        default:            printf("error: unknown command %s\n",s);            break;        }    }    return 0;}#define MAXVAL 100int sp=0;double val[MAXVAL];void push(double f){    if(sp<MAXVAL)        val[sp++]=f;    else        printf("error: stack full,can't push %g\n",f);}double pop(void){    if(sp>0)        return val[--sp];    else{        printf("error: stack empty\n");        return 0.0;    }}#include <ctype.h>int li=0;int getop(char line[],char s[]){    int i,c;    while((s[0]=c=line[li++])==' '||c=='\t')        ;        printf("li:%d|",li);    if(c=='\0')        return EOF;    s[1]='\0';    i=0;    if(!isdigit(c)&&c!='.')        return c;    if(isdigit(c))        while(isdigit(s[++i]=c=line[li++]))        ;    if(c=='.')        while(isdigit(s[++i]=c=line[li++]))        ;    s[i]='\0';    --li;    putchar(c);    return NUMBER;}int getline(char s[],int lim){    int c,i;    for(i=0;i<lim-1&&(c=getchar())!=EOF&&c!='\n';++i)        s[i]=c;    if(c=='\n'){        s[i]=c;        ++i;    }    s[i]='\0';    return i;}

若无语句识别字符数组结束标记,则出错

    if(c=='\0')        return EOF;

需要以下语句回读一个字符

    --li;

输入一行运行完,再输入一个字符即结束。要继续计算,需要把getline放到getop里。

字符数组默认是’\0’(P72/text 4.9 在不进行显式初始化的情况下,外部变量和静态变量都将被初始化为0,而自动变量和寄存器变量的初值则没有定义),测试:

#include <stdio.h>main(){    char s[5];    if(s[0]=='\0')        return 1;    else        return 0;}

答案

#include <stdio.h>#include <stdlib.h>#define MAXOP 100#define NUMBER '0'#define MAXLINE 100int getop(char []);void push(double);double pop(void);int getline(char s[],int lim);main(){    int type;    double op2;    char s[MAXOP];    while((type=getop(s))!=EOF){        printf("s:%s",s);        switch(type){        case NUMBER:            push(atof(s));            break;        case '+':            push(pop()+pop());            break;        case '*':            push(pop()*pop());            break;        case '-':            op2=pop();            push(pop()-op2);            break;        case '/':            op2=pop();            if(op2!=0.0)                push(pop()/op2);            else                printf("error: zero divisor\n");            break;        case '\n':            printf("\t%.8g\n",pop());            break;        default:            printf("error: unknown command %s\n",s);            break;        }    }    return 0;}#define MAXVAL 100int sp=0;double val[MAXVAL];void push(double f){    if(sp<MAXVAL)        val[sp++]=f;    else        printf("error: stack full,can't push %g\n",f);}double pop(void){    if(sp>0)        return val[--sp];    else{        printf("error: stack empty\n");        return 0.0;    }}#include <ctype.h>int li=0;char line[MAXLINE];int getop(char s[]){    int i,c;    if(line[li]=='\0')        if(getline(line,MAXLINE)==0)            return EOF;        else            li=0;    while((s[0]=c=line[li++])==' '||c=='\t')        ;    s[1]='\0';    i=0;    if(!isdigit(c)&&c!='.')        return c;    if(isdigit(c))        while(isdigit(s[++i]=c=line[li++]))        ;    if(c=='.')        while(isdigit(s[++i]=c=line[li++]))        ;    s[i]='\0';    --li;    putchar(c);    return NUMBER;}int getline(char s[],int lim){    int c,i;    for(i=0;i<lim-1&&(c=getchar())!=EOF&&c!='\n';++i)        s[i]=c;    if(c=='\n'){        s[i]=c;        ++i;    }    s[i]='\0';    return i;}
0 0
原创粉丝点击