如何修改C语言程序使其支持首字母大小写的数学函数名输入
C语言数学函数程序大小写兼容修复方案
问题根源
当前代码使用区分大小写的strcmp函数做字符串匹配,预设的函数名均为首字母大写格式,输入小写开头的函数名时无法匹配成功,因此会报错。
修复方法
方案1:使用大小写不敏感比较函数(最简修改)
你代码中已经添加了_CRT_SECURE_NO_WARNINGS宏,说明是Windows Visual Studio开发环境,直接将循环内的比较语句替换即可:
找到原代码中的判断逻辑:
if (strcmp(function[function_name], name) == 0)
替换为:
if (_stricmp(function[function_name], name) == 0)
_stricmp是VS提供的大小写不敏感字符串比较函数,替换后不管输入是sin、Sin还是SIN都可以正常匹配。
如果需要兼容Linux、Mac等POSIX系统,可以添加预处理适配:
// 在头文件引入区域添加适配逻辑 #ifdef _WIN32 #define STRICMP _stricmp #else #include <strings.h> #define STRICMP strcasecmp #endif // 比较时使用适配后的宏即可 if (STRICMP(function[function_name], name) == 0)
方案2:统一字符串格式后比较(无平台依赖)
如果不想依赖平台专属接口,可以手动将输入的函数名转为和预设值一致的格式再比较:
- 首先引入字符处理头文件:
#include <ctype.h>
- 在读取用户输入的
name之后,匹配循环之前添加转换逻辑:
if (strlen(name) > 0) { // 首字母转大写 name[0] = toupper(name[0]); // 剩余字符转小写 for (int i = 1; name[i] != '\0'; i++) { name[i] = tolower(name[i]); } }
转换完成后,原有strcmp比较逻辑不需要修改即可兼容大小写输入。
额外优化建议
- 你当前定义的输入缓冲区
char name[6];长度为6,刚好容纳最长的函数名Log10(5个字符+1位结束符),如果后续新增更长的函数名需要同步调整缓冲区长度 - 可以给
scanf添加长度限制避免缓冲区溢出:scanf("%5s", name);
内容的提问来源于stack exchange,提问作者Ttyytt Tfghgg
相关产品推荐
相关产品推荐

