C语言 检查输入数学表达式字符串是否错误

1. 问题描述

        用户输入的一个字符串中有数字和运算符,但是会有错误,例如:“3×+(5÷3)”,编写一个函数检测出来输入是否有错误

2. 问题解析

        C语言中,用户输入“数学表达式”字符串,判断输入的字符串是否有误。

则有判断条件:

        1.数字:可以跟运算符。

        2.运算符:不能和另一个运算符连在一起。

        3.括号:不能出现不匹配的括号或在括号前后出现不合法的字符(如运算符或数字)。

        4.非法字符:例如字母、其他符号都会被检测为无效。

  

        结合实际用户输入,默认限制条件如下:

        1.输入数字字符串范围:0~9

        2.输入运算符范围:+ - * /  ×  ÷ (表示方式不同的乘除号)

        3.输入括号范围:( )

   

3.编写函数

        编写isValidExpression() 函数检查字符串是否符合常见的数学表达式格式。

/*-----------------------------------------------------------------------*/
/*
*  @file  app.c
*  @brief
*        功能:
*        <li>关于 app.c 的功能描述:
*        	1.检查输入数学表达式字符串是否错误.	
*        </li> 本文件用于C语言demo开发模板。  </li>
*  @design  Mr.C
*  @Frunze软件开发
*  @2025年2月5日
*/
/*-----------------------------------------------------------------------*/
/* 头文件 */
#include <stdio.h>
#include <string.h>
#include <ctype.h>  //用于检查字符是否是数字或其他类型
/*-----------------------------------------------------------------------*/


/*-----------------------------------------------------------------------*/
/*
*  @brief
*		关于 isValidExpression 的功能描述:
*			检查输入数学表达式字符串是否错误 函数.
*			(检测字符串是否包含有效的数字、运算符和括号).
*  @param[in]  char *expr  输入的字符串
*
*  @return 
*		return 非0:   判断表达式有效.
*		return 0:   判断表达式无效.
*  @implements XXXX
*/
int isValidExpression(char *expr) 
{
	int i = 0;
	int len = strlen(expr) - 1;
	int lastCharWasOperator = 1;  //标记上一个字符是否是运算符
	/*-----------------------*/
	for (i = 0; i < len; i++) 
	{
		char ch = expr[i];

		if (isdigit(ch)) //C 库函数 int isdigit(int c) 检查所传的字符是否是十进制数字字符。
		{
			lastCharWasOperator = 0;  //数字后面可以跟运算符或者数字
		}
		else if (ch == '+' || ch == '-' || ch == '*' || ch == '/' || ch == '×' || ch == '÷')
		{
			if (lastCharWasOperator) 
			{
				return 0;  //如果运算符前一个字符也是运算符,则无效
			}
			lastCharWasOperator = 1;  //标记运算符后面跟数字
		}
		else if (ch == '(') 
		{
			if (i > 0 && isdigit(expr[i - 1])) 
			{
				return 0;  //括号前不能是数字
			}
			lastCharWasOperator = 1;  //括号后面要跟数字或括号
		}
		else if (ch == ')') 
		{
			if (lastCharWasOperator) 
			{
				return 0;  //括号后面不能是运算符
			}
			lastCharWasOperator = 0;  //括号后面应该跟数字
		}
		else 
		{
			return 0;  //如果遇到非法字符(如字母等)
		}
	}
	/*-----------------------*/
	return !lastCharWasOperator;//最后一个字符不能是运算符
}
/*-----------------------------------------------------------------------*/
int main() 
{
	char expr[100] = {0};
	printf("请输入一个表达式: ");
	fgets(expr, sizeof(expr), stdin);//读取输入
	/*-----------------------*/
	// 检查输入是否有效
	if (isValidExpression(expr)!=0) 
	{
		printf("表达式有效!\n");
	}
	else
	{
		printf("表达式无效!\n");
	}
	/*-----------------------*/
	return 0;
}
/*-----------------------------------------------------------------------*/

    

4.实际结果

5. 备注

        以上功能函数的开发是在对应约束下完成,如朋友想拓展,在对应位置添加判断逻辑即可。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值