C 为什么加密代码会给出问号,而文本包含s后面的字母,密钥是13?
所以,我在写一个加密代码。我的代码接收单词或任何消息,并要求用户输入密钥。最终输出是加密的消息。例如:C 为什么加密代码会给出问号,而文本包含s后面的字母,密钥是13?,c,encryption,uppercase,lowercase,letter,C,Encryption,Uppercase,Lowercase,Letter,所以,我在写一个加密代码。我的代码接收单词或任何消息,并要求用户输入密钥。最终输出是加密的消息。例如: 请输入要加密的文本:hello 输入键:4 加密文本为:lipps 但有一个问题。当我输入包含s的文本时,它会给加密打上问号: 请输入要加密的文本:ssss 输入键:13 加密文本为:���� 当我写除13以外的其他键时,如果字母是大写,则不会出现此问题。当文本包含s(t,v,u,w,x,y,z)之后的任何字母且键为13时,就会发生此问题 上述代码为: #包括 #包括 内部主(空){ in
请输入要加密的文本:hello
输入键:4
加密文本为:lipps
但有一个问题。当我输入包含s
的文本时,它会给加密打上问号:
请输入要加密的文本:ssss
输入键:13
加密文本为:����
当我写除13以外的其他键时,如果字母是大写,则不会出现此问题。当文本包含s(t,v,u,w,x,y,z)之后的任何字母且键为13时,就会发生此问题
上述代码为:
#包括
#包括
内部主(空){
int i;
int键;
字符文本[101],ch;
printf(“请输入要加密的文本:”;
fgets(文本、尺寸(文本)、标准DIN);
printf(“输入键:”);
scanf(“%i”和键)(&key);
对于(i=0;文本[i]!='\0';++i){
ch=文本[i];
如果(ch>='a'&&ch'z'){
ch=ch-'z'+'a'-1;
}
text[i]=ch;
}
否则如果(ch>='A'&&ch'Z'){
ch=ch-'Z'+'A'-1;
}
text[i]=ch;
}
}
printf(“加密文本为:%s”,text);
}
问题在于行ch=ch+键
当您有ch
和key
的值,其总和大于char
变量中可存储的值时。例如,对于字符's'
(ASCII值115)和13
的键
,总和为128
——这会溢出8位有符号字符(最大值127),并导致负数
大写字符出现问题的可能性要小得多(除非键
的值非常大),因为它们的ASCII值明显较低('a'thru'Z'为65…90,而'a'thru'Z'为97…122)
要解决此问题,请将'temporary'ch
变量设置为int
,并在所有计算完成后将其转换回char
:
#包括
#包括
内部主(空)
{
int i,ch;//使用int作为临时“ch”变量
int键;
字符文本[101];
printf(“请输入要加密的文本:”;
fgets(文本、尺寸(文本)、标准DIN);
printf(“输入键:”);
scanf(“%i”和键)(&key);
对于(i=0;文本[i]!='\0';++i){
ch=文本[i];
如果(ch>='a'&&ch'z'){
ch=ch-'z'+'a'-1;
}
text[i]=(char)ch;//将int转换为char以避免编译器警告
}
否则如果(ch>='A'&&ch'Z'){
ch=ch-'Z'+'A'-1;
}
文本[i]=(字符)ch;
}
}
printf(“加密文本为:%s”,text);
返回0;
}
问题似乎是,当结果字符超过当前字母序列('a'.'z'或'a'.'z')时,代码没有返回到该字母序列的开头(i=0;(text[i]!='\0')&&(text[i]!='\n');++i)