我的 Vigenere Cypher CS50 有什么问题
What's wrong with my Vigenere Cypher CS50
我的 CS50 pset2 Vigenere 密码代码如下。请帮我找出错误。当键包含字母 'a' 时,这段代码基本上什么都不做。它说 "Floating Point Exception"。我不知道那是什么意思。请检查代码并告诉我错误是什么。
#include<stdio.h>
#include<cs50.h>
#include<ctype.h>
#include<string.h>
int main(int argc, string argv[])
{
//check if there are only two command line arguments//
if (argc!=2)
{
printf("Please enter a valid input!\n");
return 1;
};
string key = argv[1];
for(int i=0, n=strlen(key); i < n; i++)
{
//check if there is any number in the key//
if(!isalpha(key[i]))
{
printf("Invalid Key!\n");
return 1;
};
//converting the key into ints.//
if(islower(key[i]))
{
key[i] = key[i] - 'a';
}
else if(isupper(key[i]))
{
key[i] = key[i] - 'A';
};
};
//prompt user for the string//
string s = GetString();
int c;
int k;
int stln = strlen(s);
int kyln = strlen(key);
for(int j = 0, m = strlen(s); j < m; j++)
{
if(islower(s[j]))
{
s[j] = s[j] - 'a';
//for wrapping around the key//
if(stln > kyln)
{
k = j % strlen(key);
c = (s[j] + key[k]) % 26;
s[j] = 'a' + c;
}
else
{
c = (s[j] + key[j]) % 26;
s[j] = 'a' + c;
};
}
else if (isupper(s[j]))
{
s[j] = s[j] - 'A';
//for wrapping around the key//
k = j % strlen(key);
if(stln > kyln)
{
c = (s[j] + key[k]) % 26;
s[j] = 'A' + c;
}
else
{
c = (s[j] + key[j]) % 26;
s[j] = 'A' + c;
};
};
};
printf("%s\n", s);
};
strlen(key)
在后面的代码中无效,因为每当使用 'a'
或 'A'
时,前面的代码都会在 key[]
中注入空字符:
if(islower(key[i])) {
key[i] = key[i] - 'a';
在更改其内容之前找到 key[]
的字符串长度并使用它
int n = strlen(key);
...
// k = j % strlen(key);
k = j % n;
我的 CS50 pset2 Vigenere 密码代码如下。请帮我找出错误。当键包含字母 'a' 时,这段代码基本上什么都不做。它说 "Floating Point Exception"。我不知道那是什么意思。请检查代码并告诉我错误是什么。
#include<stdio.h>
#include<cs50.h>
#include<ctype.h>
#include<string.h>
int main(int argc, string argv[])
{
//check if there are only two command line arguments//
if (argc!=2)
{
printf("Please enter a valid input!\n");
return 1;
};
string key = argv[1];
for(int i=0, n=strlen(key); i < n; i++)
{
//check if there is any number in the key//
if(!isalpha(key[i]))
{
printf("Invalid Key!\n");
return 1;
};
//converting the key into ints.//
if(islower(key[i]))
{
key[i] = key[i] - 'a';
}
else if(isupper(key[i]))
{
key[i] = key[i] - 'A';
};
};
//prompt user for the string//
string s = GetString();
int c;
int k;
int stln = strlen(s);
int kyln = strlen(key);
for(int j = 0, m = strlen(s); j < m; j++)
{
if(islower(s[j]))
{
s[j] = s[j] - 'a';
//for wrapping around the key//
if(stln > kyln)
{
k = j % strlen(key);
c = (s[j] + key[k]) % 26;
s[j] = 'a' + c;
}
else
{
c = (s[j] + key[j]) % 26;
s[j] = 'a' + c;
};
}
else if (isupper(s[j]))
{
s[j] = s[j] - 'A';
//for wrapping around the key//
k = j % strlen(key);
if(stln > kyln)
{
c = (s[j] + key[k]) % 26;
s[j] = 'A' + c;
}
else
{
c = (s[j] + key[j]) % 26;
s[j] = 'A' + c;
};
};
};
printf("%s\n", s);
};
strlen(key)
在后面的代码中无效,因为每当使用 'a'
或 'A'
时,前面的代码都会在 key[]
中注入空字符:
if(islower(key[i])) {
key[i] = key[i] - 'a';
在更改其内容之前找到 key[]
的字符串长度并使用它
int n = strlen(key);
...
// k = j % strlen(key);
k = j % n;