Vigenere.c CS50 浮点异常(核心已转储)
Vigenere.c CS50 Floating Point Exception (Core Dumped)
我正在做哈佛 CS50 的 Vigenere 练习(以防您注意到我使用的是字符串而不是 str)。
My program gives me a Floating Point Exception error when I use "a" in the keyword.
它实际上给了我那个错误
- 当我单独使用 "a" 和
- 当我在一个更大的词中使用 "a" 时,它只会给我错误的输出。
- 对于任何其他类型的关键字,该程序都可以正常工作。
我已经 运行 一百万次测试。为什么要这样做?我看不到我在哪里除或 % 除以 0。关键字的长度始终至少为 1。这可能是一些非常简单的错误,但我已经这样做了大约 10 个小时,我几乎记不起我的名字了。
#include <stdio.h>
#include <cs50.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>
int main (int argc, string argv[])
{
//Error message if argc is not 2 and argv[1] is not alphabetical
if (argc != 2)
{
printf("Insert './vigenere' followed by an all alphabetical key\n");
return 1;
}
else if (argv[1])
{
for (int i = 0, n = strlen(argv[1]); i < n; i++)
{
if (isalpha((argv[1])[i]) == false)
{
printf("Insert './vigenere' followed by an all alphabetical key\n");
return 1;
}
}
//Store keyword in variable
string keyword = argv[1];
//Convert all capital chars in keyword to lowercase values, then converts them to alphabetical corresponding number
for (int i = 0, n = strlen(keyword); i < n; i++)
{
if (isupper(keyword[i])) {
keyword[i] += 32;
}
keyword[i] -= 97;
}
//Ask for users message
string message = GetString();
int counter = 0;
int keywordLength = strlen(keyword);
//Iterate through each of the message's chars
for (int i = 0, n = strlen(message); i < n; i++)
{
//Check if ith char is a letter
if (isalpha(message[i])) {
int index = counter % keywordLength;
if (isupper(message[i])) {
char letter = (((message[i] - 65) + (keyword[index])) % 26) + 65;
printf("%c", letter);
counter++;
} else if (islower(message[i])) {
char letter = (((message[i] - 97) + (keyword[index])) % 26) + 97;
printf("%c", letter);
counter++;
}
} else {
//Prints non alphabetic characters
printf("%c", message[i]);
}
}
printf("\n");
return 0;
}
}
此行为是由行 keyword[i] -= 97;
引起的,您将密钥流中的每个 'a' 设为零。稍后您在转换后的密钥上使用 strlen()
。因此,当密钥以 'a' 开头时,其 keywordLength 被设置为零,并且 modulo keywordLength 操作进入除以零。您可以通过在键转换之前计算关键字长度来解决此问题。
我正在做哈佛 CS50 的 Vigenere 练习(以防您注意到我使用的是字符串而不是 str)。
My program gives me a Floating Point Exception error when I use "a" in the keyword.
它实际上给了我那个错误
- 当我单独使用 "a" 和
- 当我在一个更大的词中使用 "a" 时,它只会给我错误的输出。
- 对于任何其他类型的关键字,该程序都可以正常工作。
我已经 运行 一百万次测试。为什么要这样做?我看不到我在哪里除或 % 除以 0。关键字的长度始终至少为 1。这可能是一些非常简单的错误,但我已经这样做了大约 10 个小时,我几乎记不起我的名字了。
#include <stdio.h>
#include <cs50.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>
int main (int argc, string argv[])
{
//Error message if argc is not 2 and argv[1] is not alphabetical
if (argc != 2)
{
printf("Insert './vigenere' followed by an all alphabetical key\n");
return 1;
}
else if (argv[1])
{
for (int i = 0, n = strlen(argv[1]); i < n; i++)
{
if (isalpha((argv[1])[i]) == false)
{
printf("Insert './vigenere' followed by an all alphabetical key\n");
return 1;
}
}
//Store keyword in variable
string keyword = argv[1];
//Convert all capital chars in keyword to lowercase values, then converts them to alphabetical corresponding number
for (int i = 0, n = strlen(keyword); i < n; i++)
{
if (isupper(keyword[i])) {
keyword[i] += 32;
}
keyword[i] -= 97;
}
//Ask for users message
string message = GetString();
int counter = 0;
int keywordLength = strlen(keyword);
//Iterate through each of the message's chars
for (int i = 0, n = strlen(message); i < n; i++)
{
//Check if ith char is a letter
if (isalpha(message[i])) {
int index = counter % keywordLength;
if (isupper(message[i])) {
char letter = (((message[i] - 65) + (keyword[index])) % 26) + 65;
printf("%c", letter);
counter++;
} else if (islower(message[i])) {
char letter = (((message[i] - 97) + (keyword[index])) % 26) + 97;
printf("%c", letter);
counter++;
}
} else {
//Prints non alphabetic characters
printf("%c", message[i]);
}
}
printf("\n");
return 0;
}
}
此行为是由行 keyword[i] -= 97;
引起的,您将密钥流中的每个 'a' 设为零。稍后您在转换后的密钥上使用 strlen()
。因此,当密钥以 'a' 开头时,其 keywordLength 被设置为零,并且 modulo keywordLength 操作进入除以零。您可以通过在键转换之前计算关键字长度来解决此问题。