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. 备注
以上功能函数的开发是在对应约束下完成,如朋友想拓展,在对应位置添加判断逻辑即可。