Chinaunix

标题: C++中如何区别输入流中的字符和数值? [打印本页]

作者: streethacker    时间: 2013-01-04 16:55
标题: C++中如何区别输入流中的字符和数值?
C++中如何区别输入流中的字符和数值?

实际问题是:
需要输入一个运算表达式:(5+9)*3-2,并计算其值,
我用了双栈,然后逐个提取输入值,通过压栈、出栈操作获得计算结果,但是当读入5时,是以字符形式读入的。
怎样才能以整型读入?
作者: dinglong08    时间: 2013-01-04 18:22
目前来看不行,因为你的实际要求,并不能知道下一个输入应该是什么类型
作者: lrita    时间: 2013-01-04 18:57
自己设计协议就行了。
作者: yulihua49    时间: 2013-01-04 19:17
streethacker 发表于 2013-01-04 16:55
C++中如何区别输入流中的字符和数值?

实际问题是:

既然你是计算表达式,肯定都是字符。
判断字符是否数字:
isdigit(c);//true:0-9
作者: streethacker    时间: 2013-01-04 19:59
怎样自定义协议?不太懂
回复 3# lrita


   
作者: streethacker    时间: 2013-01-04 20:01
但问题是,如果是字符放入操作数栈,当弹出进行运算时,比如加法实际的运算就变成了:'5'+'9'了
这个怎么解决?
回复 4# yulihua49


   
作者: yulihua49    时间: 2013-01-04 20:17
本帖最后由 yulihua49 于 2013-01-04 21:10 编辑
streethacker 发表于 2013-01-04 19:59
怎样自定义协议?不太懂
回复 3# lrita


用正则表达式吧:
[+-]{0.1}[0-9]+([.][0-9]*){0,1}([eE][+-]{0,1}[0-9]+){0,1}
作者: yulihua49    时间: 2013-01-04 20:21
streethacker 发表于 2013-01-04 20:01
但问题是,如果是字符放入操作数栈,当弹出进行运算时,比如加法实际的运算就变成了:'5'+'9'了
这个怎么解 ...

当然要先用正则表达式分离出数字,转换成数字型再入栈。
作者: streethacker    时间: 2013-01-04 20:37
对C++的正则表达式不是很了解,有没有相关的资料可以推荐一下?
回复 7# yulihua49


   
作者: yulihua49    时间: 2013-01-04 21:13
本帖最后由 yulihua49 于 2013-01-04 21:15 编辑
streethacker 发表于 2013-01-04 20:37
对C++的正则表达式不是很了解,有没有相关的资料可以推荐一下?
回复 7# yulihua49

这种属于脚本语言,应该读读regex,lex,YACC工具。
正则表达式是普遍使用的词法分析工具,自己搜索一下,多得很。

YACC的例子就是一个计算器,直接拿来用好了。
作者: streethacker    时间: 2013-01-04 22:03
多谢~~
回复 10# yulihua49


   
作者: socay2    时间: 2013-01-11 11:00
本帖最后由 socay2 于 2013-01-11 11:06 编辑

cout << 1 + "ab" << endl;

这是一种什么情况,打印了个 b

想了下,应该是 "ab" 的地址偏移一个字节,就是 b 了
可是 C++ 的 operator+() 好像没有重载  int + char* 的
  1. string operator+ (const string& lhs, const string& rhs);
  2. string operator+ (const char* lhs, const string& rhs);
  3. string operator+ (char lhs, const string& rhs);
  4. string operator+ (const string& lhs, const char* rhs);
  5. string operator+ (const string& lhs, char rhs);
复制代码

作者: rpk74m    时间: 2013-01-12 13:17
int n;
char c;
if(isdigit(cin.peek())) cin>>n;
else cin>>c;
作者: rpk74m    时间: 2013-01-12 20:13
回复 12# socay2


    int+char*,这在c中就有
这是原生运算,不是重载operator+
作者: deusrwxf    时间: 2013-01-12 21:54
你首先要把它当成一个字符串输入,然后自己解析出来再计算。
作者: niaokedaoren    时间: 2013-01-14 13:16
这样就行了:先判断一下是不是数字,然后转换 ‘5’ - ‘0’
因为ascii码,‘0’到‘9’是相连的。




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2