使用无符号字符的Caesar密码函数?
我正在处理一个Caesar函数,它给定输入和偏移量,返回输出。我不确定我是否在做这件事。我做错了什么?感谢您的帮助。 还有,如果有人能告诉我如何使用未签名字符使用无符号字符的Caesar密码函数?,c,C,我正在处理一个Caesar函数,它给定输入和偏移量,返回输出。我不确定我是否在做这件事。我做错了什么?感谢您的帮助。 还有,如果有人能告诉我如何使用未签名字符 void encrypt(unsigned char* message_input, char off, unsigned char* message_output) { int m_inp; while(*(message_input+ m_inp)!=EOF) { *(message_out
void encrypt(unsigned char* message_input, char off, unsigned char* message_output) {
int m_inp;
while(*(message_input+ m_inp)!=EOF)
{
*(message_output+ m_inp) = (*((unsigned char*)input + m_inp) + offset )%256;
}
}
你写的代码有很多错误 1) 您尚未初始化m_inp,但正在延迟(消息输出+m_inp) 2) 您正在检查输入字符串的EOF,这毫无意义 请看一下这段代码,这是一个更好的凯撒密码实现
#include <stdio.h>
void caesar (char cipher[], int shift);
int main () {
char cipher[50];
int shift;
printf("Enter text to be encrypted IN CAPITAL LETTERS ONLY: ");
scanf("%s", cipher);
printf("How many shifts do you prefer? 1-10 only: ");
scanf("%d", &shift);
caesar (cipher, shift);
return 0;
}
void caesar (char cipher[], int shift) {
int i = 0;
while (cipher[i] != '\0') {
if ((cipher[i] += shift) >= 65 && (cipher[i] + shift) <= 90) {
cipher[i] += (shift);
} else {
cipher[i] += (shift - 25);
}
i++;
}
printf("%s", cipher);
}
#包括
void-caesar(字符密码[],int-shift);
int main(){
字符密码[50];
int移位;
printf(“仅输入要用大写字母加密的文本:”);
scanf(“%s”,密码);
printf(“您喜欢多少班次?仅1-10班:”;
scanf(“%d”和shift);
凯撒(密码,移位);
返回0;
}
void caesar(字符密码[],int移位){
int i=0;
while(密码[i]!='\0'){
如果((cipher[i]+=shift)>=65&&(cipher[i]+shift),则代码存在许多正确性和风格问题
正确性问题
循环变量m_inp
未初始化
unsigned char
不太可能等于EOF
。EOF
的值为-1。循环永远不会结束(除非您使用非常奇怪的体系结构)
传统的凯撒密码按字母顺序操作,而不是对整个ASCII字符集进行操作
文体问题
使用更“风格正确”的C将使其他程序员更容易阅读您的代码。这些都是主观的
名称m_inp
对于短循环中的循环变量来说是个糟糕的名称。请改用i
阅读ptr[i]
比阅读*(ptr+i)
更容易,即使它们在C中完全相同
将输入标记为const unsigned char*
可以更明显地看出它没有被修改
使用int
而不是char
作为偏移量
传统上,功能输出在左边,输入在右边。然而,这并不重要
修订守则
这是一个示例修订版。它接受以NUL结尾的字符串,并将Caesar编码/解码版本写入输出缓冲区。这是我编写函数的方式,不一定是您编写函数的方式:
void caesar(char *output, const char *input, int shift)
{
int i;
for (i = 0; input[i]; i++) {
if (input[i] >= 'a' && input[i] <= 'z')
output[i] = (input[i] - 'a' + shift) % 26 + 'a';
else if (input[i] >= 'A' && input[i] <= 'Z')
output[i] = (input[i] - 'A' + shift) % 26 + 'A';
else
output[i] = input[i];
}
output[i] = '\0';
}
void caesar(字符*输出,常量字符*输入,整数移位)
{
int i;
对于(i=0;输入[i];i++){
如果(input[i]>='a'&&input[i]='a'&&input[i]EOF
类型为int
且具有负值。类型为unsigned char
的所有对象的值均为正值。您的比较将始终为真(永远、永远、永远……)。如果不初始化m_-inp,则无法取消引用(message_-output+m_-inp)就是说,我正在尝试使用无符号字符,而不是有符号字符或只有字符来实现这一点。我看不到字符串文字。@DietrichEpp我是说不可变的字符*message\u输入和字符*message\u输出字符串@我做了上面的更改。这看起来像是rite吗?是什么使它们不可变?@DietrichEpp,我想我知道创建的字符串是cOnStand,修改它们是不明确的,但不能回忆在哪里,请帮助我如果你能。但是我发现它是在C++中贬值的。