作为pset2 CS50的一部分,用于vigerne的密码。我的问题是我应该如何安排我的循环'if's?我不认为我做得恰到好处。
请指出我的代码中的任何错误/错误。 (我的缩进似乎很糟糕)
到目前为止,我获得的加密与他们在cs50上提供的加密相匹配。但我希望改善这一点。提前谢谢。
#include <stdio.h>
#include <cs50.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
int main(int argc ,string argv[])
{
// Make sure 1 argument is given
if(argc !=2)
{
printf("Please enter only 1 alphabetical word as key\n");
return 1; //returns an error if no 2nd arg is provided.
}
// Converting 2nd argument into an integer
string k=argv[1];
for(int i=0,n=strlen(k);i<n;i++)
{
if(!isalpha(k[i]))
{
char c= k[i];
printf("%c is not an alphabet. Please enter only alphabets.\n",c);
return 2; //returns an error if key has non-alphabets
}
}
// Prompt for plaintext to be encrypted
printf("Please enter the plain text you wish to encrypt\n");
string p=GetString();
printf("This is your text: %s\n",p);
// Converting upper/lower case alphabets to 0-25 indexed
for(int i=0,j=0,n=strlen(p),m=strlen(k);i < n; i++,j++)
{
if(p[i]==' ')
{
j--;
}
if(isupper(k[j]))
{
k[j] = (int)(k[j]-'A');
}
if(islower(k[j]))
{
k[j] = (int)(k[j]-'a');
}
// printf("%d\n",k[i]); // value of k[i] is still stored as int here for ea char
if(isalpha(p[i]))
{
if(isupper(p[i]))
{
int newpindex =(p[i]-'A');
int x = (newpindex + k[(j+m)%(m)])%26;
int cipher = x + 'A';
printf("%c",cipher);
}
else if(islower(p[i]))
{
int newpindex =(p[i]-'a');
int x = (newpindex + k[(j+m)%(m)])%26;
int cipher = x + 'a';
printf("%c",cipher);
}
}
else
printf("%c",p[i]);
}
printf(" \n");
}
答案 0 :(得分:0)
代码中的一个可能错误是识别既不是字母也不是空格的字符。
查看代码,j在循环的每次迭代中递增,要求在遇到空格时递减。但是,如果非字母字符是感叹号或其他符号怎么办?
考虑是否有更好的方法来处理循环中的j,以确保在这种情况下你不会丢失键中的位置。这也可以消除检查空格(或一般符号)的需要,从而使代码更简洁。
编辑:刚看到其他东西,isupper和islower包含isalpha(isalpha详细信息的手册页,它相当于isupper ||更低)。因此,您可以选择删除isalpha条件,只检查isupper / islower。
答案 1 :(得分:0)
if(p[i]==' ')
{
j--;
}
这个if语句不起作用,因为字符串k中的第一个字符是空格,因为这会使j = -1,所以在下一个if语句中使用它作为p [-1]将不起作用。 一个更好的选择是删除这个if语句,所以在p [i]是一个空格的情况下,它显示就像它没有修改一样。
为了使代码看起来更干净,您可以从只有一条指令的if语句中删除大括号。
例如:
if(isupper(k[j]))
k[j] = (int)(k[j]-'A');