C语言大小写互转函数失效求助:主函数可用封装后异常
问题分析与修复方案
核心问题
你的代码封装函数后失效的原因有两个关键问题:
- 函数重复读取输入:主函数已经用
fgets()获取了用户输入并传入函数,但函数内部又用getchar()重新读取输入,导致实际处理的不是主函数传入的字符串,而是用户再次输入的内容。 - 全局变量滥用:
i、count等全局变量会导致函数逻辑耦合,且参数sentence与全局数组同名,容易引发混淆。
修复后的代码
#include <stdio.h> #include <ctype.h> // 转换大小写的函数:接收字符串指针,直接修改原字符串 void swapCase(char *sentence) { // 遍历字符串直到结束符 for (int i = 0; sentence[i] != '\0'; i++) { if (islower(sentence[i])) { sentence[i] = toupper(sentence[i]); } else if (isupper(sentence[i])) { sentence[i] = tolower(sentence[i]); } // 非字母字符保持不变 } } int main() { char sentence[100]; printf("请输入你的句子:"); // 读取输入,注意处理fgets可能带回的换行符 fgets(sentence, 100, stdin); // 去掉fgets读取的换行符(如果存在) for (int i = 0; sentence[i] != '\0'; i++) { if (sentence[i] == '\n') { sentence[i] = '\0'; break; } } printf("原句子:%s\n", sentence); swapCase(sentence); printf("转换后的句子:%s\n", sentence); return 0; }
关键修改点
- 移除函数内的输入读取逻辑:函数专注于大小写转换功能,不再自行获取输入,完全依赖传入的参数。
- 替换全局变量为局部变量:在函数和主函数内使用局部变量,避免全局变量带来的逻辑混乱。
- 优化转换逻辑:明确判断字母的大小写状态,非字母字符不做处理,同时处理
fgets读取的换行符,避免输出时多一个空行。 - 函数命名更清晰:将
KUlowerL改为swapCase,更直观表达功能。
内容的提问来源于stack exchange,提问作者TheLuckyGuy
相关产品推荐
相关产品推荐

