首页 > 解决方案 > 如何在 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;
}

标签: cfor-loopif-statementrot13

解决方案


你的代码几乎没问题。但是 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;
}

推荐阅读