【问题标题】:How do i fix error at f letter and so on at rot13 c program如何在 rot13 c 程序中修复 f 字母等错误
【发布时间】:2021-09-10 06:23:23
【问题描述】:

我是编程新手。我目前正在用 c 编写一个 rot13 程序,我尝试使用“for”,“if”,它可以工作,直到字母 f 显示问号。如果我要从 a-z 写字母,加密结果就像: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;
}

【问题讨论】:

  • 首先,永远不要永远使用getsit's so dangerous,它甚至已经完全从C语言中删除了。使用例如fgets 代替。其次,请缩进您的代码,以便更容易阅读和了解正在发生的事情。请记住,C 中的字符串实际上称为 null-terminated 字符串。
  • 解决您的问题:以此为契机,学习如何使用 调试器 在监控变量及其值的同时逐语句执行代码。
  • 使用模运算符。 sth like (letter+13)%26 so 33 become 7 without the if and else
  • 好的,谢谢你们,非常感谢。

标签: c for-loop if-statement rot13


【解决方案1】:

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

【讨论】:

  • 实际上,“ASCII”本身就是一个时代错误。当您确实指的是 0..127 字符范围时,请使用“ASCII-7”,除此之外使用 ISO/IEC 8859Windows code page 术语,因为没有“扩展 ASCII”标准。我有一个很好的side-by-side chart 来展示它们的异同。
  • 谢谢您,先生。我需要对这个 ascii、二进制文件及其相关性进行更多研究。
【解决方案2】:

char 很可能已在您的计算机上签名。所以ch = ch + 13 在某些情况下最终是负面的(例如,当chz 时)。因此if(ch &gt; 'z'){ 无法按预期工作。

试试

int main(void) {
    char ch = 'z';
    ch = ch + 13;
    if (ch > 'z')
    {
        puts("Larger");
    }
    else
    {
        puts("Less or equal");
    }
    printf("ch value is %d\n", ch);
    return 0;
}

这可能会打印:

Less or equal
ch value is -121

使用无符号类型或 int 进行计算。

【讨论】:

    最近更新 更多