Vigenere.c CS50 Исключение с плавающей запятой (основной дамп)

Я работаю над упражнением Виженера из Гарвардского университета CS50 (если вы заметили, что я использую string, а не str).

Моя программа выдает ошибку исключения с плавающей запятой, когда я использую "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;
    }   
}

person EcuaCode    schedule 09.09.2015    source источник


Ответы (1)


Это поведение вызвано строкой keyword[i] -= 97;, где вы делаете каждую букву «a» в ключевом потоке нулем. Позже вы используете strlen() для преобразованного ключа. Таким образом, когда ключ начинается с «а», длина ключевого слова для этого устанавливается равной нулю, а операция по модулю ключевого слова Длина входит в деление на ноль. Это можно исправить, рассчитав длину ключевого слова перед преобразованием ключа.

person Rudi    schedule 09.09.2015
comment
Большое спасибо Руди. Это сразу исправило! - person EcuaCode; 09.09.2015