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

C语言一维数组中toupper函数无法正常工作的问题求助

问题描述

我尝试用toupper函数和额外数组将一维数组中的关键词转换为大写,但代码无法正常运行。

原代码

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>

int main () {
    char prog1[20], prog2[20];
    char ch1, ch2;
    int j = 0;
    printf ("Enter a prog:");
    gets(prog1);
    printf ("Enter keywords:");
    gets(prog2);
    char upper = toupper(ch2);
    while (prog1[j])
    {
        ch1 = prog1[j];
        ch2 = prog2[j];
        putchar(toupper(ch2));
        j++;
    }
    return 0;
}

当前运行结果

Enter a prog:aaa bbb ccc
Enter keywords:bbb
BBB`?

期望结果

Enter a prog:aaa bbb ccc
Enter keywords:bbb
aaa BBB ccc

问题分析与修正

原代码核心问题

  1. 逻辑完全偏离需求:当前代码是遍历prog1的长度,直接输出prog2对应位置的字符转大写,但prog2长度远短于prog1,超出部分会读取内存垃圾值,导致乱码。
  2. gets函数已被废弃:存在严重的缓冲区溢出风险,安全性极低。
  3. 未实现"在原字符串中匹配关键词并替换为大写"的核心逻辑。

修正后的代码

#include <stdio.h>
#include <ctype.h>
#include <string.h>

int main() {
    char prog1[100], prog2[100];
    
    // 用fgets替代gets,避免缓冲区溢出
    printf("Enter a prog:");
    fgets(prog1, sizeof(prog1), stdin);
    // 去除fgets读取的换行符
    prog1[strcspn(prog1, "\n")] = '\0';
    
    printf("Enter keywords:");
    fgets(prog2, sizeof(prog2), stdin);
    prog2[strcspn(prog2, "\n")] = '\0';
    
    int prog1_len = strlen(prog1);
    int prog2_len = strlen(prog2);
    
    // 处理关键词为空的边界情况
    if (prog2_len == 0) {
        printf("%s\n", prog1);
        return 0;
    }
    
    int i = 0;
    while (i < prog1_len) {
        // 检查当前位置是否匹配关键词
        if (strncmp(&prog1[i], prog2, prog2_len) == 0) {
            // 匹配成功,转大写输出关键词
            for (int k = 0; k < prog2_len; k++) {
                putchar(toupper(prog1[i + k]));
            }
            // 跳过关键词长度的字符,避免重复匹配
            i += prog2_len;
        } else {
            // 不匹配则直接输出原字符
            putchar(prog1[i]);
            i++;
        }
    }
    putchar('\n');
    
    return 0;
}

修正说明

  1. 替换gets为fgets,并通过strcspn去除换行符,保证字符串处理的安全性和正确性。
  2. 使用strncmp实现子串匹配,精准定位prog1中与关键词prog2一致的部分。
  3. 匹配到关键词时,逐个字符转大写输出;未匹配则直接输出原字符,完全符合需求逻辑。
  4. 增加了关键词为空的边界处理,避免异常情况。

内容的提问来源于stack exchange,提问作者Lvrnnk

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 16:30:58