【发布时间】:2017-03-14 19:49:00
【问题描述】:
大家好,我开始学习 C,我被要求专门编写一个程序,一个凯撒密码(因此,我们的想法是将消息中的任何字母替换为字母表中三个位置的字母。)
我的实现应该读取一行文本,然后根据读取的第一个字符执行加密或解密。如果第一个字符是 $,那么我应该加密该行的其余部分,并在输出之前加上字符 ?。如果第一个字符是 ?,那么我应该解密该行的其余部分,并在我的输出之前加上字符 $。
例如:?wr eh, ru qrw wr eh
输出应该是:$To be, or not to be
反之亦然。
到目前为止,这是我的代码:
#include <stdio.h>
int main(void){
char code[100], ch;
int i;
scanf("%s", &code);
if(code[0] == '$'){
for(i = 0; code[i] != '\0'; ++i){
ch = code[i];
if(ch >= 'a' && ch <= 'z'){
ch = ch + 3;
if(ch > 'z'){
ch = ch - 'z' + 'a' - 1;
}
code[i] = ch;
}
else if(ch >= 'A' && ch <= 'Z'){
ch = ch + 3;
if(ch > 'Z'){
ch = ch - 'Z' + 'A' - 1;
}
code[i] = ch;
}
}
printf("?%s\n", code);
return 0;
}
}
但问题是,它返回第一个字符并在有空格时停止。 比如我输入:$To be 它输出到:?$To
谁能帮我弄清楚我做错了什么?
【问题讨论】:
-
使用
fgets而不是scanf。 -
注意:
%sofscanf不包括空格。 -
...因为
scanf("%s", &code);(在任何情况下都应该是scanf("%s", code);)在第一个空白字符处停止。 -
我建议一次读取和处理输入的一个字符(例如使用
getchar()),而不是先将其全部读入字符串。这不仅可以让您克服当前的问题,而且还可以处理任意长的行,甚至(有一些警告)多行输入。
标签: c encryption caesar-cipher