CS50 PSET 2 凯撒错误结果
CS50 PSET 2 Caesar Erroneous Results
以为我已经完成了 Caesar,但是当 运行 CHeck50 时,我的代码因为这个原因而失败:使用 23 作为密钥将 "barfoo" 加密为 "yxocll"
输出无效的 ASCII 文本
日志
运行 ./凯撒 23...
正在发送输入 barfoo...
检查输出 "ciphertext: yxocll "...
有人能看出我的代码有什么问题吗?它似乎适用于大写字母,但对于小写字母和某些 'keys',我得到了错误的结果,并且无法找出原因。任何帮助将不胜感激。
示例: 如果我尝试用密钥 17 加密 'foo',它应该 return 'wff',但我的代码是仅 returning 'w'。使用我编写的代码,它说要转到位置 128,这不是一个字母,但我的代码然后说如果这超过 122,减去 26。这等于 returns '102',-即 'f'。是不是和delete赋值给127
有关
#include <cs50.h>
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <stdlib.h>
int main(int argc, string argv[])
{
if (argc == 2) {
int a = atoi (argv[1]);
int b = a%26;
printf("plaintext: ");
//get string
string s = get_string();
printf ("ciphertext: ");
//iterate through string
for (int i=0, n =strlen(s); i<n; i++) {
//check if character is a letter
if ( isalpha (s[i])) {
//check if letter is uppercase
if (isupper (s[i])) {
//calculate position of character in ASCI by adding 'Key'. If character is over 90, decrease character location by 26
char c = (s[i] + b);
if (c > 90) {
char d = c - 26;
printf ("%c", d);
} else
printf("%c", c);
} else
//For lowercase letters. If character location is over position 122, decrease location by 26
{
char e = (s[i] + b);
if (e>122) {
char f = e - 26;
printf("%c", f);
} else
printf("%c", e);
}
} else //print non letters with no change made
{
printf ("%c", s[i]);
}
}
}
printf ("\n");
return 0;
}
小写字母可能会溢出:
char e = (s[i] + b);
在您的系统上,char
是有符号的,这意味着它可以取 −128 到 127 之间的值。取小写字母 z,即 ASCII 122。将其移动 6 位或更多位,您溢出你的char
。有符号整数溢出是未定义的行为。您可以通过使中间值 int
s:
来解决此问题
int e = (s[i] + b);
以为我已经完成了 Caesar,但是当 运行 CHeck50 时,我的代码因为这个原因而失败:使用 23 作为密钥将 "barfoo" 加密为 "yxocll" 输出无效的 ASCII 文本 日志 运行 ./凯撒 23... 正在发送输入 barfoo... 检查输出 "ciphertext: yxocll "...
有人能看出我的代码有什么问题吗?它似乎适用于大写字母,但对于小写字母和某些 'keys',我得到了错误的结果,并且无法找出原因。任何帮助将不胜感激。
示例: 如果我尝试用密钥 17 加密 'foo',它应该 return 'wff',但我的代码是仅 returning 'w'。使用我编写的代码,它说要转到位置 128,这不是一个字母,但我的代码然后说如果这超过 122,减去 26。这等于 returns '102',-即 'f'。是不是和delete赋值给127
有关#include <cs50.h>
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <stdlib.h>
int main(int argc, string argv[])
{
if (argc == 2) {
int a = atoi (argv[1]);
int b = a%26;
printf("plaintext: ");
//get string
string s = get_string();
printf ("ciphertext: ");
//iterate through string
for (int i=0, n =strlen(s); i<n; i++) {
//check if character is a letter
if ( isalpha (s[i])) {
//check if letter is uppercase
if (isupper (s[i])) {
//calculate position of character in ASCI by adding 'Key'. If character is over 90, decrease character location by 26
char c = (s[i] + b);
if (c > 90) {
char d = c - 26;
printf ("%c", d);
} else
printf("%c", c);
} else
//For lowercase letters. If character location is over position 122, decrease location by 26
{
char e = (s[i] + b);
if (e>122) {
char f = e - 26;
printf("%c", f);
} else
printf("%c", e);
}
} else //print non letters with no change made
{
printf ("%c", s[i]);
}
}
}
printf ("\n");
return 0;
}
小写字母可能会溢出:
char e = (s[i] + b);
在您的系统上,char
是有符号的,这意味着它可以取 −128 到 127 之间的值。取小写字母 z,即 ASCII 122。将其移动 6 位或更多位,您溢出你的char
。有符号整数溢出是未定义的行为。您可以通过使中间值 int
s:
int e = (s[i] + b);