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()是标准安全做法,需要注意两个核心点:
fgets()会读取输入末尾的换行符\n,需手动移除,否则会干扰后续字符串处理和输出格式。- 调用
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
相关产品推荐
相关产品推荐

