c - 如何在 rot13 c 程序中修复 f 字母等错误
问题描述
我是编程新手。我目前正在用 c 编写一个 rot13 程序,我尝试使用“for”,“if”,它可以工作,直到字母 f 显示问号。如果我要从 az 写信,加密结果就像:nopqrstuvwxyzabcde???????? . 我试图改变加法/减法值、变量、int。结果并不好。
#include<stdio.h>
int main()
{
char message[100], ch;
int i;
printf("Enter a message to encrypt: ");
gets(message);
for(i = 0; message[i] != '\0'; ++i){
ch = message[i];
if(ch >= 'a' && ch <= 'z'){
ch = ch + 13;
if(ch > 'z'){
ch = ch - 26;
}
message[i] = ch;
}
else if(ch >= 'A' && ch <= 'Z'){
ch = ch + 13;
if(ch > 'Z'){
ch = ch - 26;
}
message[i] = ch;
}
}
printf("Encrypted message: %s", message);
return 0;
}
解决方案
你的代码几乎没问题。但是 ASCII 有一个问题。正如我们所知,Ascii 包含 ASCII (0-127) 字符和扩展的 ASCII (128-255) 字符。Ascii 使用 7 位表示,而扩展 ASCII 使用 8 位。因此,当 的值ch + 13
超过 127 并且您从中减去 26 时,它基本上会产生一个负十进制数。您可以像这样通过打印检查printf("%d", ch);
。并且没有与负十进制数相关联的 ascii 字符。这就是它产生垃圾值的原因。您应该在分配前检查ch = ch + 13
。检查以下代码以供参考。
#include<stdio.h>
int main()
{
char message[100], ch;
int i;
printf("Enter a message to encrypt: ");
scanf("%s", message);
for(i = 0; message[i] != '\0'; ++i){
ch = message[i];
if(ch >= 'a' && ch <= 'z'){
if (ch + 13 > 'z') {
ch = ch - 13;
}
else ch = ch + 13;
message[i] = ch;
}
else if(ch >= 'A' && ch <= 'Z'){
if (ch + 13 > 'Z') {
ch = ch - 13;
}
else ch = ch + 13;
message[i] = ch;
}
}
printf("Encrypted message: %s", message);
return 0;
}
推荐阅读
- c - 为什么insertBeg没有在开头插入节点
- c++ - 防止对类成员的并发读/写
- javascript - 必需的字符串参数不存在:与 fetch 通信
- r - 如何将 here() 用于 css、before_body 和 after_body 的路径?
- c# - C# WebService 客户端返回全部 NULL,SoapUI 使用相同的调用正确返回
- javascript - 如何在 HTML 页面中声明 JS 变量
- python-3.x - 使用 gmail API 从 oauth2.googleapis.com 获取令牌时出错
- powerbi - 在 MDX 中使用过滤器运行总计?
- excel - 如何使用 pandas excel writer 在 excel 文件中写入数据?
- django - 尝试加载数据时无法识别新模型