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

C语言加密程序中替换gets()实现三行字符串输入的问题

替换加密程序中的gets()函数

我写了一个简单的加密程序,在线C编译器里运行完全正常,但提交作业时报错。排查后发现是评审方不允许使用gets()函数,现在需要替换掉代码里的gets(),试了好几种方法都没解决。

输入示例

ZEBRASCDFGHIJKLMNOPQTUVWXY
FLEE AT ONCE WE ARE DISCOVERED
FLEE AT ONCE WE ARE DISCOVERED

输出示例

SIAA ZQ LKBA VA ZOA RFPBLUAOAR
SIAA ZQ LKBA VA ZOA RFPBLUAOAR

现有代码

#include <stdio.h>

int main() {
int i, len1, len2, j;
char toenc1[27], toenc2[27], enc[27], alph[27] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
gets(enc);
gets(toenc1); // 需要替换这几行
gets(toenc2);
len1 = strlen(toenc1);
len2 = strlen(toenc2);
for (i = 0 ; i < len1 ; i ++){
    for (j = 0; j < 27 ; j++){
        if (toenc1[i] == alph[j]){
        toenc1[i] = enc[j]; 
        j=26;
        }
    }
}
for (i = 0 ; i < len2 ; i ++){
    for (j = 0; j < 27 ; j++){
        if (toenc2[i] == alph[j]){
        toenc2[i] = enc[j]; 
        j=26;
        }
    }
}
printf("%s \n", toenc1);
printf("%s", toenc2);
return 0;
}

解决方案:用fgets()替换gets()

gets()因存在缓冲区溢出风险已被C标准废弃,所以评审方禁止使用。替换为fgets()是标准安全做法,需要注意两个核心点:

  1. fgets()会读取输入末尾的换行符\n,需手动移除,否则会干扰后续字符串处理和输出格式。
  2. 调用fgets()时必须指定缓冲区大小,避免溢出。

修改后的完整代码:

#include <stdio.h>
#include <string.h> // 必须包含,用到strlen和strcspn

int main() {
    int i, len1, len2, j;
    char toenc1[27], toenc2[27], enc[27], alph[27] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    
    // 替换gets为fgets,并移除换行符
    fgets(enc, sizeof(enc), stdin);
    enc[strcspn(enc, "\n")] = '\0';
    
    fgets(toenc1, sizeof(toenc1), stdin);
    toenc1[strcspn(toenc1, "\n")] = '\0';
    
    fgets(toenc2, sizeof(toenc2), stdin);
    toenc2[strcspn(toenc2, "\n")] = '\0';
    
    len1 = strlen(toenc1);
    len2 = strlen(toenc2);
    
    // 优化内层循环:字母只有26个,循环到25即可,用break替代强制修改j值
    for (i = 0 ; i < len1 ; i ++){
        for (j = 0; j < 26 ; j++){
            if (toenc1[i] == alph[j]){
                toenc1[i] = enc[j]; 
                break;
            }
        }
    }
    for (i = 0 ; i < len2 ; i ++){
        for (j = 0; j < 26 ; j++){
            if (toenc2[i] == alph[j]){
                toenc2[i] = enc[j]; 
                break;
            }
        }
    }
    
    printf("%s\n", toenc1);
    printf("%s\n", toenc2); // 统一输出格式,和示例匹配
    return 0;
}

关键修改说明

  • 新增#include <string.h>:strlen()和strcspn()函数依赖这个头文件。
  • strcspn(enc, "\n"):返回换行符在字符串中的索引,将该位置设为'\0'即可移除换行符。
  • 内层循环上限改为26:字母表只有26个大写字母,循环到索引25足够,之前的27是冗余的。
  • 用break替代j=26:找到匹配字母后直接跳出内层循环,代码更简洁易读。
  • 调整printf格式:确保输出换行符和示例一致,避免格式差异导致的报错。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 12:15:38