C 中的 Caesar Cypher 给出不正确的输出
Caesar Cypher in C giving incorrect output
尝试在 C 中创建 Caesar Cypher 并在移动字母时从超过 'z' 的小写字母中获得一些麻烦的输出
#include <stdio.h>
void confab(const char* inText, int shift, char* outText)
{
int i = 0;
int j = 0;
char character = '[=10=]';
while (inText[i] != '[=10=]') {
if (inText[i] >= 'A' && inText[i] <= 'Z') {
character = inText[i] + shift;
if (character > 'Z') {
character = character - 'Z' + 'A' - 1;
}
outText[j] = character;
j += 1;
} else if (inText[i] >= 'a' && inText[i] <= 'z') {
character = inText[i] + shift;
if (character > 'z') {
character = (character - 'z' + 'a' - 1);
}
outText[j] = character;
j += 1;
} else {
outText[j] = inText[i];
j += 1;
}
i += 1;
}
}
int main(void)
{
char buffer[60] = {0};
char* s = "The quick brown fox jumps over the lazy dog.";
confab(s, 13, buffer);
printf("%s\n", buffer);
}
正在给出输出:
Gur d2vpx oeb4a sb5 w2zc0 b3re 1ur yn76 qbt.
而不是:
Gur dhvpx oebja sbk whzcf bire gur ynml qbt.
怀疑我的 ASCII 算法在小写字母的 if 语句中不正确。
您的代码存在的问题是 character
变量被声明为带符号的 1 字节数字。
所以通过查看ASCII table,a-z
在97-122的范围内。问题是当你尝试移动超过 5 个时,它会 溢出 因为 带符号的 1 字节数不能超过 127.
因此,将 char character = '[=12=]';
更改为 unsigned char character = '[=13=]';
即可。
你可以在这里参考任何字节的最大整数个数 - https://en.wikipedia.org/wiki/Integer_(computer_science)#Common_integral_data_types
尝试在 C 中创建 Caesar Cypher 并在移动字母时从超过 'z' 的小写字母中获得一些麻烦的输出
#include <stdio.h>
void confab(const char* inText, int shift, char* outText)
{
int i = 0;
int j = 0;
char character = '[=10=]';
while (inText[i] != '[=10=]') {
if (inText[i] >= 'A' && inText[i] <= 'Z') {
character = inText[i] + shift;
if (character > 'Z') {
character = character - 'Z' + 'A' - 1;
}
outText[j] = character;
j += 1;
} else if (inText[i] >= 'a' && inText[i] <= 'z') {
character = inText[i] + shift;
if (character > 'z') {
character = (character - 'z' + 'a' - 1);
}
outText[j] = character;
j += 1;
} else {
outText[j] = inText[i];
j += 1;
}
i += 1;
}
}
int main(void)
{
char buffer[60] = {0};
char* s = "The quick brown fox jumps over the lazy dog.";
confab(s, 13, buffer);
printf("%s\n", buffer);
}
正在给出输出:
Gur d2vpx oeb4a sb5 w2zc0 b3re 1ur yn76 qbt.
而不是:
Gur dhvpx oebja sbk whzcf bire gur ynml qbt.
怀疑我的 ASCII 算法在小写字母的 if 语句中不正确。
您的代码存在的问题是 character
变量被声明为带符号的 1 字节数字。
所以通过查看ASCII table,a-z
在97-122的范围内。问题是当你尝试移动超过 5 个时,它会 溢出 因为 带符号的 1 字节数不能超过 127.
因此,将 char character = '[=12=]';
更改为 unsigned char character = '[=13=]';
即可。
你可以在这里参考任何字节的最大整数个数 - https://en.wikipedia.org/wiki/Integer_(computer_science)#Common_integral_data_types