私はハーバードの CS50 の Vigenere 演習に取り組んでいます (str ではなく string を使用していることに気付いた場合)。
キーワードに「a」を使用すると、プログラムで浮動小数点例外エラーが発生します。
それは実際に私にそのエラーを与えます
- 「a」を単独で使用する場合、および
- より大きな単語内で「a」を使用すると、間違った出力が得られます。
- 他の種類のキーワードの場合、プログラムは完全に正常に機能します。
私は100万回のテストを実行しました。なぜこれを行うのですか?どこで割っているのか、% を 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;
}
}