我正在编写这个接受命令行参数的 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);
}
}
最佳答案
这里的代码:
int c = (p + k) % 26;
printf("%c",c);
很可能不会打印任何有值(value)的东西,因为结果值将在 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
(请注意,我们假设字符代码按字母连续顺序从 A
到 Z
此处 -这适用于 ASCII,但不适用于带有 EBCDIC 的 IBM 大型机,因此请考虑自己被警告!),然后在那里进行模数学运算,然后再次添加 'A'
的代码以获得到原来的范围内。
我们在 else if
中为小写字母做同样的事情。
关于c - 使用凯撒密码加密文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42467794/