Vigenere.c CS50 浮点异常(核心转储)

Posted

技术标签:

【中文标题】Vigenere.c CS50 浮点异常(核心转储)【英文标题】:Vigenere.c CS50 Floating Point Exception (Core Dumped) 【发布时间】:2015-09-09 06:07:12 【问题描述】:

我正在研究哈佛 CS50 的 Vigenere 练习(以防你注意到我使用的是字符串而不是 str)。

当我在关键字中使用“a”时,我的程序给了我一个浮点异常错误

它实际上给了我这个错误

当我单独使用“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;
       

【问题讨论】:

【参考方案1】:

此行为是由keyword[i] -= 97; 行引起的,您将密钥流中的每个“a”都设为零。稍后您在转换后的密钥上使用strlen()。因此,当键以“a”开头时,keywordLength 被设置为零,并且模keywordLength 操作被零除。您可以通过在密钥转换之前计算关键字长度来解决此问题。

【讨论】:

非常感谢鲁迪。立即修复它!

以上是关于Vigenere.c CS50 浮点异常(核心转储)的主要内容,如果未能解决你的问题,请参考以下文章

浮点异常(核心转储)cpp

为啥我会收到“浮点异常(核心转储)”?

c_cpp CS50 vigenere.c

浮点异常(核心转储)非常奇怪

为 Linux 创建 C 程序时出现浮点异常(核心转储)

线性同余生成器的浮点异常(核心转储)