You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 05:54:22