我正在编写这个C程序,它接受命令行参数,然后加密用户稍后输入的文本。
我们通过加密中使用的命令行输入一个数字。例如,如果我们从命令行输入数字1然后用户想要加密说“aaaa”,则加密文本将是“bbbb”,只是每个都移动了一个字符。我输出了输出,但没有打印出文字。我的错是什么?
这是我的代码
int main(int argc , string argv[])
{
if(argc != 2)
{
return -1;
}
int k = atoi(argv[1]);
printf("Enter the text to be encrypted : ");
string text = get_string();
int length = strlen(text);
for(int i=0 ; i<length ; i++)
{
int p = text[i];
int c = (p + k) % 26;
printf("%c",c);
}
}
答案 0 :(得分:5)
这段代码:
int c = (p + k) % 26;
printf("%c",c);
很可能不会打印任何有价值的东西,因为结果值将在0..25范围内,在ASCII中是不同的控制字符。你要做的是检查字符是ASCII小写还是ASCII大写,然后才进行旋转,并确保结果也在相同的范围内:
unsigned int c = text[i];
if (c >= 'A' && c <= 'Z') {
c = ((c - 'A') + k) % 26 + 'A';
}
else if (c >= 'a' && c <= 'z') {
c = ((c - 'a') + k) % 26 + 'a';
}
printf("%c", c);
如果值介于'A'
和'Z'
之间,我们会减去'A'
的代码,以便这些代码从0
映射到25
(请注意我们和#39;在这里假设从A
到Z
的字符代码按字母顺序连续排序 - 这适用于ASCII,但不适用于带有EBCDIC的IBM大型机,所以请考虑自己被警告! ),然后在那里进行模数学运算,然后再次添加'A'
的代码以进入原始范围。
我们在else if
中为小写字母执行相同的操作。