C中交换字母的加密

Encryption with swapping letters in C

我需要编写一个程序,从输入中读取一个以新行结尾的句子。该程序应该以字母 'a' 与 'z'、'b' 与 'y' 等交换的方式编写句子的加密。我不应该使用数组,这就是为什么我找不到解决这个问题的方法。

这是我的代码:

#include<stdio.h>

int main() {
    char alphabet, temp;
    while( scanf("%c", &alphabet) != '\n') {
        for(char i ='a', j='z'; i <= 'z', j>='a'; i++, j--) {
            if(alphabet == i) {
                temp = j;     
            }     
        }   
        printf("%c", temp);  
    }
    return 0;
}

当我输入:abc 作为输出时,我得到 zyxxxxxxxxxxxxxxxxxxxxxxxxx(无限数量的 x)。

总结一下: Input:abc。输出:zyxxxxx(x 的无限个数).

你弄乱了 scanf 的 return 值:

while( scanf("%c", &alphabet) != '\n'){

您想在输入的字符(在 alphabet 中)是一个换行符时停止循环。 但是您测试了 scanf 的 return 值,它永远不会是 '\n',因为它 return 是转换字段的数量。

你可以这样试试:

while( scanf("%c", &alphabet) == 1 && alphabet != '\n'){

在启用警告的情况下编译您的代码(例如 Wall 标志)!这个:

for(char i ='a', j='z'; i <= 'z', j>='a'; i++, j--)

应该给:

warning: left-hand operand of comma expression has no effect [-Wunused-value]

您需要使用逻辑 AND 运算符 && 而不是两个比较之间的逗号。

此外,使用 getchar() 代替,如下所示:

#include<stdio.h>

int main() {
    char temp;
    int ch;
    while ((ch = getchar()) != '\n' && ch != EOF) {
        for(char i ='a', j='z'; i <= 'z'&& j>='a'; i++, j--){
            if(ch == i){
                temp = j;     
            }     
        }
        if(ch <= 'z'&& ch >= 'a') // do not print if 'ch' is a digit for example
            printf("%c", temp);  
    }
    return 0;
}

输出:

zyx


如果你必须使用 scanf(),然后尝试读入 alphabet,检查 scanf 的 return 值,并与换行符进行比较,如下所示:

while(scanf("%c", &alphabet) != 0 && alphabet != '\n')