题目描述(50分):
通过键盘输入100以内正整数的加、减运算式,请编写一个程序输出运算结果字符串。 输入字符串的格式为:“操作数1 运算符
操作数2”,“操作数”与“运算符”之间以一个空格隔开。
补充说明:
1、操作数为正整数,不需要考虑计算结果溢出的情况。
2、若输入算式格式错误,输出结果为“0”。
要求实现函数:
void arithmetic(const
char *pInputStr, long lInputLen, char *pOutputStr);
【输入】 pInputStr:
输入字符串
lInputLen:
输入字符串长度
【输出】 pOutputStr:
输出字符串,空间已经开辟好,与输入字符串等长;
【注意】只需要完成该函数功能算法,中间不需要有任何IO的输入输出
示例
输入:“4 + 7” 输出:“11”
输入:“4 - 7” 输出:“-3”
输入:“9 ++ 7” 输出:“0”
注:格式错误
#define MAXCHAR 256void arithmetic(const char *pInputStr, long lInputLen, char *pOutputStr);
int main(void)
{
char pInputStr3[] = {"3 + 4"};char pOutputStr3[MAXCHAR] = {0};
arithmetic(pInputStr3 , strlen(pInputStr3),pOutputStr3);
puts(pOutputStr3);
return 0;}
void arithmetic(const char *pInputStr, long lInputLen, char *pOutputStr)
{long i,locOfSpace;
int flag;
long numOfSpace=0;
if(pInputStr[0]==‘ ‘|| pInputStr[lInputLen-1]==‘ ‘) //输入串的开头结尾有空格非法
{
pOutputStr[0]=‘0‘ ;
pOutputStr[0]=‘\0‘;
return;
}
for(i=0;i<lInputLen;i++) //中间空格非法,例如"连着出现++"的情况
{
if(pInputStr[i]==‘ ‘)
{
locOfSpace = i;//输入合法则最终记录的肯定是第二个空格的位置
numOfSpace++;
if(numOfSpace == 1)
flag = 1;//flag = 1标记遇到的第一个空格;
else
flag = 0;
if(flag == 1 && pInputStr[i+2] !=‘ ‘) //判断条件要写全
{
pOutputStr[0]=‘0‘ ;//如果直接写pOutputStr=“0”,为什么非法时什么都不输出呢,不是应该输出0吗?
pOutputStr[0]=‘\0‘; //因为这样是把指针pOutputStr的值本身改变了,让pOutputStr指向了全局的字面值常量区,
//但作为形参pOutputStr不能回传给实参,所以要从本质上改变pOutputStr本身指向的区域。return;
}
}
}
if(numOfSpace != 2) //空格数不等于2非法
{
pOutputStr[0]=‘0‘ ;
pOutputStr[0]=‘\0‘;
return;
}char operat = pInputStr[locOfSpace-1];
char pnum1[256]={0},pnum2[256]={0};//给pnum1和pnum2不要声明成指针,因为要new进行初始化。声明为数组要指定数组大小。
long j = 0,k=0;for(i=0;i<locOfSpace-2;i++)//第一个操作数存放到pnum1中
pnum1[j++]=pInputStr[i];
pnum1[j]=‘\0‘;for(i=locOfSpace+1;i<=lInputLen;i++)//第一个操作数存放到pnum2中
pnum2[k++]=pInputStr[i];long num1,num2,result;
num1 = atoi(pnum1);//atoi的参数直接是char*,如果参数是string则参数还得写成s.c_str()
num2 = atoi(pnum2);if(operat == ‘+‘)
result = num1+num2;
else if(operat == ‘-‘)
result = num1-num2;
else
{
pOutputStr[0]=‘0‘ ;
pOutputStr[0]=‘\0‘;
return;
}pOutputStr=itoa(result,pOutputStr,10);//result转换后存储到pOutputStr中
}
复习下面这道题:
//(1)
char *strA()
{
char str[] = "hello,world"‘;
return str;
}//(2)
const char *strA()
{
char *str = "hello,world";
return str;
}
(1)是错误的,(2)是正确的,因为 char c[] ="hello,world";是分配一个局部数组(局部数组存放在函数的栈帧)
char *c = ="hello,world";是分配一个全局数组。(全局数据存放在全局区域)