在C中交换字母加密

时间:2017-09-15 08:58:25

标签: c loops encryption io alphabet

我需要编写一个程序,从输入中读取一个以新行终止的句子。该程序应该以一个字母“#a;'与'',' 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)。

总结一下: 输入:ABC。输出:zyxxxxx(无限个x)。

2 个答案:

答案 0 :(得分:3)

你搞砸了scanf的返回值:

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

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

你可以尝试这样:

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

答案 1 :(得分:2)

在启用警告的情况下编译代码(例如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的返回值,并与换行符进行比较,如下所示:

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