通过键盘输入100以内正整数的加、减运算式。实现string_cnt函数

通过键盘输入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,防止其可能的越界。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值
>