Vigenere CS50-需要帮助循环使用字母
我正试着做这件事Vigenere CS50-需要帮助循环使用字母,c,cs50,vigenere,C,Cs50,Vigenere,我正试着做这件事 #包括 #包括 #包括 #包括 #包括 int main(int argc,字符串argv[]) { //检查2个命令行参数 如果(argc!=2) { printf(“不,兄弟,你必须有两个参数。\n”); 返回1; } //支票是阿尔法 否则{ 对于(int i=0;i
#包括
#包括
#包括
#包括
#包括
int main(int argc,字符串argv[])
{
//检查2个命令行参数
如果(argc!=2)
{
printf(“不,兄弟,你必须有两个参数。\n”);
返回1;
}
//支票是阿尔法
否则{
对于(int i=0;i
根据检查结果,以下是我的错误代码:
我明白我的问题在于循环遍历每个字母,而不是将其应用于空格或符号。我尝试过使用if(isalpha)语句和else printf(“”),但它对数字或符号不起作用。我认为添加j++只会遍历alpha字符,但似乎没有帮助
这里有什么我没有的吗?代码的基本结构看起来不错 我认为它有三个问题:
printf
s都由if(isalpha(p[i]))
检查保护,因此如果纯文本字符不是字母字符,程序将不会输出任何内容(它应该输出不变的字符)。解决方法很简单;只要在循环中删除外部if(…)
:
for (int i = 0, j = 0, n = strlen(p); i < n; i++)
{
if (isupper(p[i]))
{
printf("%c", ((p[i] - 65) + (k[(j % cipherlen)]) - 65) % 26 + 65);
j++;
}
else if (islower(p[i]))
{
printf("%c", ((p[i] - 97) + (k[(j % cipherlen)]) - 97) % 26 + 97);
j++;
}
else
printf ("%c", p[i]);
}
(我厌倦了重复键入相同的表达式,所以我将公共位提取到变量(key\u char
,key\u shift
)。这里唯一棘手的部分是,只有在实际使用key\u shift
时,j
才应该递增,但您的代码已经处理了这一点。)
函数(例如isupper
,isalpha
,…)都有未定义的行为<在许多实现中,code>char是有符号类型,因此随机字符str[i]
很可能是负数。为了完全可移植且正确,您应该在每次此类调用中将字符强制转换为(unsigned char)
:
if (isupper((unsigned char)key_char))
...
if (isupper((unsigned char)p[i]))
...
else if (islower((unsigned char)p[i]))
...
或者,完全接受ASCII(代码的其余部分假定它已经存在),并执行以下操作:
如果(key_char>='A'&&key_char='A'&&p[i]='A'&&p[i]“string”似乎是“char*”类型,那么它可能是可以的…@melpomene它应该适用于ascii代码@LeoH您应该使用isprint()
而不是isalpha()
来输出“$!
等等。哇。非常感谢。你完全帮助我从一个新的角度看待事物。但问题是-我们有什么理由使用key\u shift=key\u char-'a'而不是说tolower()?
for (int i = 0, j = 0, n = strlen(p); i < n; i++)
{
char key_char = k[j % cipherlen];
int key_shift;
if (isupper(key_char)) {
key_shift = key_char - 'A';
} else {
key_shift = key_char - 'a';
}
if (isupper(p[i]))
{
printf("%c", ((p[i] - 'A') + key_shift) % 26 + 'A');
j++;
}
else if (islower(p[i]))
{
printf("%c", ((p[i] - 'a') + key_shift) % 26 + 'a');
j++;
}
else
printf ("%c", p[i]);
}
if (isupper((unsigned char)key_char))
...
if (isupper((unsigned char)p[i]))
...
else if (islower((unsigned char)p[i]))
...
if (key_char >= 'A' && key_char <= 'Z')
...
if (p[i] >= 'A' && p[i] <= 'Z')
...
else if (p[i] >= 'a' && p[i] <= 'z')
...