练习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
- 练习4-10 另一种方法是通过getline函数读入整个输入行,这种情况下可以不使用getch和ungetch函数
- 练习 4-10 另一种方法是通过 getline 函数读入整个输入行,这种情况下可以不使用 getch 与 ungetch 函数
- 练习4-7 编写一个函数ungets(s),将整个字符串压回到输入中。ungets函数需要使用buf和bufp吗?它能否仅使用ungetch函数
- 练习4-11 修改getop函数,使其不必使用ungetch函数。提示:可以使用一个static类型的内部变量解决该问题
- getch( )与ungetch( )两个函数有什么用途呢?
- 读入——getline()函数和cin
- 练习4-9 以上介绍的getch与ungetch函数不能正确地处理压回的EOF。考虑压回EOF时应该如何处理?请实现你的设计方案
- C语言实现getch()和ungetch()
- C_kbhit()和getch()函数的使用
- C/C++如何使用密码输入而不回显--getch()函数
- C/C++如何使用密码输入而不回显--getch()函数
- C++ getline()函数读入一行字符
- 1.9中getline函数和copy函数练习
- 函数调用的方法有很多,再次介绍两种方法,一种是通过文件共享,另一种方法是通过头文件来定义函数
- Linux下实现getch()函数
- getch()、getche()和getchar()函数
- getch()、getche()和getchar()函数
- getch()、getche()和getchar()函数
- Effective C++ 笔记二构造/析构/赋值运算
- Mybatis Mapper xml映射配置知识总结
- B. Bear and Finding Criminals
- 古代猪文 [Sdoi2010][Codevs 1830]
- iOS开发常用国外网站清单
- 练习4-10 另一种方法是通过getline函数读入整个输入行,这种情况下可以不使用getch和ungetch函数
- 使用shell区分Android软硬重启问题
- 不要忘记·············调用库···
- 依然排序
- C++程序设计语言练习7.11 标准参数宏的使用
- android自定义进度条
- 第16周阅读程序1(3)
- 圣杯布局&双飞翼布局认识
- android studio 更新 Gradle错误解决方法