CString char *之间的相互转化

/*
***
**将CString 转化为 char * 
*/
char * GetAnsiString( const CString &str)
{
 int nSize = 2*str.GetLength();
 
 char *pAnsiString = new char[nSize + 1];
 wcstombs(pAnsiString, str, nSize+1);
return pAnsiString;
}
/*
**wcstombs(char* strDes, const wchar*, size_t nMax);这个函数的作用是把wchar转换为char。**char* strDes 为保存转换后的普通字符串,wchar* 要被转换的宽字符串。转换的最大长度。这里的长度是转换的个数,而不是字节长度。
**mbstowcs() 就是一个相反的过程了
*/
/*
**mbstowcs(..);
*/
/*
**复杂运算的计算器

void CCalculatorDlg::OnBnClickedEq()
{
	// TODO: 在此添加控件通知处理程序代码
	char str[100];
	char * q;
	q = GetAnsiString(m_display);
	memcpy(str, q, strlen(q)+1);
	free(q);
	str[strlen(str)+1] = '\0';
	str[strlen(str)] = '#';

	stack<double> num;
	stack<char>sign;
	int global=0;

	char c,theta;
	double a,b;
	bool innum=false;

	UpdateData(TRUE);

	sign.push('#');

	c = str[global++];
	CString snum;
	while(c!='#' || sign.top()!='#')
	{
		
		if(is_num(c))//是否为数字或者小数点
		{
			if(innum == false)
			{
				innum = true;
				snum = "";//置空
			}
			 //每次叠加 直到入栈
			snum.AppendFormat(_T("%c"),c);
			
		}
		else 
		{
			if(innum == true)
			{
				innum = false;
				//进数栈
				double temp;
				char * p = GetAnsiString(snum);
				temp = atof(p);
				free(p);
				
				num.push(temp);
			}
			
			switch(Precede(sign.top(),c))
			{
			case'<':
				sign.push(c);//c=str[global++];
				break;//操作数栈栈顶元素优先级低
			case'=':
				sign.pop();//c=str[global++];
				break;//脱挂号并接受下一字符
			case'>':
				theta=sign.top();sign.pop();
				b=num.top();num.pop();a=num.top();num.pop();
				num.push(Operate(a,theta,b));
				break;//退栈并将运算结果入数栈
			default:
				break;
			}
		}

		c = c!='#'? str[global++] : c;

	}

m_display.Format(_T("%f"),num.top());
num.pop();
UpdateData(FALSE);
}
char CCalculatorDlg::Precede(char a, char b)
{
	int p=0,q=0;
	char m[8]="+-*/()#";
	char n[8][8]={">><<<>>",">><<<>>",">>>><>>",">>>><>>","<<<<<= ",">>>> >>","<<<< ="};
	while(m[p]!=a)p++;
	while(m[q]!=b)q++;
	return(n[p][q]);
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值