Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 为什么加密代码会给出问号,而文本包含s后面的字母,密钥是13?_C_Encryption_Uppercase_Lowercase_Letter - Fatal编程技术网

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)