编码 Vigenère 密码时 c 中的分段错误

Posted

技术标签:

【中文标题】编码 Vigenère 密码时 c 中的分段错误【英文标题】:segmentation fault in c while coding Vigenère’s cipher 【发布时间】:2016-06-21 20:42:40 【问题描述】:

我对编码真的很陌生,我一直在自学如何使用 EDX.org 进行编码。这周我一直在学习密码学,我必须创建一个 Vigenère 密码。我编写了代码,在大多数情况下,它是正确的。但是,当我编译程序时,它显示了分段错误。我一直试图弄清楚为什么会发生这种情况,我完全被困住了。你能看看我的代码并告诉我有什么问题吗?

#include <stdio.h>
#include <stdlib.h>
#include <cs50.h>
#include <string.h>
#include <ctype.h>


int index(int k, int c); 

int main (int argc, string argv[1])

    //check for correct criteria 
    if (argc = 2, isalpha(argv[1]))
    
        string text = GetString(); 
        string key = argv[1]; //store key word
        int Totalshift = strlen(key); //number of shift for keyword


        int shift = 0; 

        //loops over the whole text
        for (int i = 0, n = strlen(text); i <n; i++ )
        
            char p= text[i];
            char k = toupper(key[shift]); //Upper case for each character

           if (isupper(p))
            
               //convert to 0 index
                 p = p - 65; 
                 k = k - 65; 

                int crypt= index (k , p); 

                printf("%c", crypt+65);

                shift= (shift+1) %Totalshift; 
            
            else if (islower(p))
            

                p = p - 97; 
                k = k - 65; 

                int crypt= index (k , p); 

                printf("%c", crypt+97);

                shift= (shift+1) %Totalshift; 
            
            else 
            
                printf("%c", p);
            


        
            printf("\n");
        




    //error message
    else
    
        printf("ERROR!\n");
        return 1; 
    




//index function
int index(int k, int p)

   return (k+p)% 26; 


【问题讨论】:

【参考方案1】:

string

不。 永远不要隐藏指针。

int main(int argc, char ** argv)

然后:

//check for correct criteria 
if (argc = 2, isalpha(argv[1]))

在这里,您将值2分配给变量(参数在这方面的行为类似于局部变量),从而破坏了先前的值(它保存了给程序的参数数量) .结果是分配的值,即2。然后是comma operator:你丢弃那个2,然后调用isalpha(argv[1]),这清楚地说明了为什么你应该总是打开警告永远,永远隐藏指针强>:

argv[1]char * 类型,因此是一个指向字符数组的指针(或者,在这种情况下,我们知道以'\0' 结尾的字符数组,称为C 字符串)。由于isalphatakes an int as parameter 指针的值(“内存地址”)被隐式转换为(可能非常大)int 值。引用上面的链接,强调我的:

c 参数是一个 int,应用程序应确保其值可表示为无符号字符或等于宏 EOF 的值。如果参数有任何其他值,行为未定义

这可能是分段错误的来源。

最后,GetString 在我看来真的很可疑。假设它分配了一些内存(对于它可能从用户读取的字符串)......你在哪里释放该内存?它真的是在分配内存,还是可能返回一个指向具有自动存储持续时间的数组的指针(可以说是一个局部变量)?

【讨论】:

谢谢丹尼尔。我很感激你的回答。 GetString 和字符串都来自上面提到的 CS50 库。您提到的操作员和 getalpha 的问题解决了这个问题。现在程序运行正常。

以上是关于编码 Vigenère 密码时 c 中的分段错误的主要内容,如果未能解决你的问题,请参考以下文章

如何让我的 Vigenère 密码处理消息中的空格?

C中的Vigenère密码,如何仅在字母字符上移动关键字

Python Vigenère密码不起作用

JavaScript 中的 Vigenère 密码显示或 � 字符

[字符串][NOIP2012]Vigenère密码

维吉尼亚密码(Vigenère cipher)