通过键盘输入100以内正整数的加、减运算式,请编写一个程序输出运算结果字符串。输入字符串的格式为:“操作数1 运算符 操作数2”,“操作数”与“运算符”之间以一个空格隔开。
说明:
1、操作数为正整数,不需要考虑计算结果溢出的情况。
2、若输入算式格式错误,输出结果为“0”。
要求实现函数:
void string_cnt(const char *input_str, char *out_buf, int out_buf_size);
【输入】unput_str:输入字符串空间地址
out_buf_size:输出空间大小
【输出】out_buf:输出地址空间
示例
输入:“4 + 7” 输出:“11”
输入:“4 - 7” 输出:“-3”
输入:“4 ++ 7” 输出:“Err” 注:格式错误
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
bool isNum(char c) //判断是否是数字
{
if(c >= '0' && c <= '9')
{
return true;
}
return false;
}
bool isOperator(char c) //判断是否是操作符
{
if(c != '+' && c != '-')
{
return false;
}
return true;
}
void string_cnt(const char *input_str, char *out_buf, int out_buf_size)
{
if(input_str == NULL || out_buf == NULL || out_buf_size == 0)
{
printf("error\n");
return;
}
if(strlen(input_str) == 0)
{
printf("input_str error\n");
return;
}
char operator1[strlen(input_str)];
memset(operator1, 0, sizeo(operator1));
char operator2strlen(input_str)];
memset(operator2, 0, sizeo(operator2));
int operator1_i = 0, operator2_i = 0;
int input_str_i = 0; //输入字符串的下标
int out_buf_i = 0; //输出字符串的下标
char opt;
if(isNum(input_str[input_str_i])) //判断输入格式是否正确
{
while(isNum(input_str[input_str_i])) //取操作数1的字符串
{
operator1[operator1_i ] = input_str[input_str_i];
operator1_i ++;
input_str_i++;
if(input_str_i == strlen(input_str))
{
if(out_buf_i > out_buf_size)
{
printf("Array access out of bounds\n");
return;
}
out_buf[out_buf_i ++] = '0'; //格式错误输出结果为0
if(out_buf_i > out_buf_size)
{
printf("Array access out of bounds\n");
return;
}
out_buf[out_buf_i] = '\0';
printf("Format1_error\n");
return;
}
}
operator1[operator1_i] = '\0';
//格式:空格+操作符+空格
if(input_str_i+3 < strlen(input_str)
&& input_str[input_str_i] == ' '
&& isOperator(input_str[input_str_i+1])
&& input_str[input_str_i+2] == ' '
&& isNum(input_str[input_str_i+3])
{
opt = input_str[input_str_i+1];
input_str_i += 3;
while(isNum(input_str[input_str_i])) //取操作数2的字符串
{
operator2[operator2_i ] = input_str[input_str_i];
operator2_i ++;
input_str_i++;
if(input_str_i == strlen(input_str))
{
operator2[operator2_i ] = '\0';
break;
}
}
}
else
{
if(out_buf_i > out_buf_size)
{
printf("Array access out of bounds\n");
return;
}
out_buf[out_buf_i ++] = '0'; //格式错误输出结果为0
if(out_buf_i > out_buf_size)
{
printf("Array access out of bounds\n");
return;
}
out_buf[out_buf_i] = '\0';
printf("Format2_error\n");
return;
}
}
else
{
if(out_buf_i > out_buf_size)
{
printf("Array access out of bounds\n");
return;
}
out_buf[out_buf_i ++] = '0'; //格式错误输出结果为0
if(out_buf_i > out_buf_size)
{
printf("Array access out of bounds\n");
return;
}
out_buf[out_buf_i] = '\0';
printf("Format3_error\n");
return;
}
int i = 0, j = 0;
int sum1 = 0, sum2 = 0;
while(operator1[i] != '\0') //操作数1转化成数字
{
if(i < 2) //限定最多两位数
{
sum1 = sim1*10 + (operator1[i ++] - '0');
}
else
{
if(out_buf_i > out_buf_size)
{
printf("Array access out of bounds\n");
return;
}
out_buf[out_buf_i ++] = '0'; //格式错误输出结果为0
if(out_buf_i > out_buf_size)
{
printf("Array access out of bounds\n");
return;
}
out_buf[out_buf_i] = '\0';
printf("Num is too large\n");
return;;
}
}
while(operator2[j] != '\0') //操作数2转化成数字
{
if(j < 2) //限定最多两位数
{
sum2 = sim2*10 + (operator1[j ++] - '0');
}
else
{
if(out_buf_i > out_buf_size)
{
printf("Array access out of bounds\n");
return;
}
out_buf[out_buf_i ++] = '0'; //格式错误输出结果为0
if(out_buf_i > out_buf_size)
{
printf("Array access out of bounds\n");
return;
}
out_buf[out_buf_i] = '\0';
printf("Num is too large\n");
return;;
}
}
switch(opt)
{
case '+':
snprintf(out_buf, 4, "%d", sum1+sum2);
break;
case '-':
snprintf(out_buf, 4, "%d", sum1-sum2);
break;
default:
if(out_buf_i > out_buf_size)
{
printf("Array access out of bounds\n");
return;
}
out_buf[out_buf_i ++] = '0'; //格式错误输出结果为0
if(out_buf_i > out_buf_size)
{
printf("Array access out of bounds\n");
return;
}
out_buf[out_buf_i] = '\0';
printf("Format4_error\n");
break;
}
return;
}
int main()
{
const char *input = "4 - 17";
char output[strlen(input) + 1];
memset(output, 0, sizeof(output));
string_cnt(input, out_buf, sizeof(output));
printf("output : %s\n", output);
return 0;
}
部分重复判断out_buf_i > out_buf_size的代码为保护输入参数out_buf_size,防止其可能的越界。